A inicialização da lista de cópias chama o copiador conceitualmente?
Antes do C ++ 11, podemos fazer a inicialização da cópia escrevendo algo comoA a = 1;
que é mais ou menos equivalente aA a = A(1);
. Ou seja, um temporário é criado primeiro e, em seguida, um copiador é chamado. Independentemente da opção de cópia, isso deve ser conceitualmente e o copiador deve estar acessível.
Com a inicialização da lista no C ++ 11, podemos fazer uma inicialização da lista de cópias escrevendoA a = {1, 2};
. Na minha opinião, isso deve ser mais ou menos equivalente aA a = A(1, 2);
. No entanto, no GCC e no clang,A a = {1, 2}
compila mesmo quando o copiador e o movedor estão inacessíveis (declarando como privado). Ainda,A a = 1;
não é compilado no GCC ou clang se o copiador / movedor correspondente correspondente estiver inacessível. Assim,A a = {1, 2};
parece mais ou menos equivalente aA a{1, 2};
que é a inicialização direta da lista. A diferença entre isso e a inicialização direta da lista real é queA a = {1, 2};
não compila se o ctor que leva duas polegadas é explícito. Nesse aspecto,A a = {1, 2};
se assemelha à inicialização de cópia.
Então, minha pergunta é: qual é a semântica exata de expressões comoA a = {1, 2};
conceitualmente? Porconceitualmente, a cópia elision não fica no caminho.