¿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.

Respuestas a la pregunta(1)

Su respuesta a la pregunta