¿La inicialización de la lista de copias invoca la copia conceptual conceptualmente?
Antes de C ++ 11, podemos hacer una inicialización de copia escribiendo algo comoA a = 1;
que es más o menos equivalente aA a = A(1);
. Es decir, primero se crea un temporal y luego se invoca una copia. Independientemente de la elisión de copia, esto debe ser tan conceptual y la copiadora debe ser accesible.
Con la inicialización de la lista en C ++ 11, podemos hacer una inicialización de la lista de copias escribiendoA a = {1, 2};
. En mi opinión, esto debería ser más o menos equivalente aA a = A(1, 2);
. Sin embargo, en GCC y clang,A a = {1, 2}
compila incluso cuando la copia y el movimiento de ctor son inaccesibles (declarándolos como privados). Todavía,A a = 1;
no se compila en GCC o clang si no se puede acceder al ctor de copia / movimiento correspondiente. Entonces,A a = {1, 2};
parece más o menos equivalente aA a{1, 2};
que es la inicialización directa de la lista. La diferencia entre esto y la inicialización de la lista directa real es queA a = {1, 2};
no se compila si el ctor que toma dos entradas es explícito. En este aspecto,A a = {1, 2};
se parece a la inicialización de copia.
Entonces, mi pregunta es: ¿cuál es la semántica exacta de expresiones comoA a = {1, 2};
conceptualmente? Porconceptualmente, copia elision no te quedes en el camino.