Prima di C++ 11, possiamo eseguire l'inizializzazione della copia scrivendo qualcosa come A a = 1;
che è più o meno equivalente a A a = A(1);
. Cioè, un temporaneo viene prima creato e quindi viene invocato un copy ctor. Indipendentemente dall'elisione della copia, questa deve essere concettualmente e il copyctor deve essere accessibile.L'inizializzazione dell'elenco di copia invoca concettualmente il copy ctor?
Con l'inizializzazione dell'elenco in C++ 11, è possibile eseguire l'inizializzazione dell'elenco di copie scrivendo A a = {1, 2};
. A mio parere, questo dovrebbe essere più o meno equivalente a A a = A(1, 2);
. Tuttavia, in GCC e clang, A a = {1, 2}
compila anche quando il copy and move ctor non è accessibile (dichiarandolo come privato). Ancora, A a = 1;
non si compila su GCC o clang se il corrispondente copia/spostamento è inaccessibile. Quindi, A a = {1, 2};
sembra più o meno equivalente a A a{1, 2};
che è l'inizializzazione dell'elenco diretto. La differenza tra questa e l'inizializzazione della lista diretta reale è che A a = {1, 2};
non viene compilato se il ctor che prende due int è esplicito. In questo aspetto, A a = {1, 2};
ricorda l'inizializzazione della copia.
Quindi, la mia domanda è: qual è la semantica esatta di espressioni come A a = {1, 2};
concettualmente? Con concettualmente, copia elision non rimanere nel modo.
Hai spiegato tutto te stesso nella domanda. L'inizializzazione dell'elenco di copie è uguale all'inizializzazione dell'elenco diretto, tranne che il primo non considera i costruttori espliciti. Né richiede un costruttore di copia accessibile. – Praetorian
@Praetorian Questo non sembra esattamente questo. Vedi il mio commento alla risposta di Columbo. – Lingxi