Ruft die Initialisierung der Kopierliste die Kopierfunktion konzeptionell auf?

Vor C ++ 11 können wir eine Kopierinitialisierung durchführen, indem wir so etwas wie @ schreibeA a = 1; das ist mehr oder weniger äquivalent zuA a = A(1);. Das heißt, zuerst wird eine temporäre Datei erstellt und dann eine Kopie von ctor aufgerufen. Unabhängig von der Kopierentscheidung muss dies konzeptionell so sein und der Kopierer muss zugänglich sein.

Mit der Listeninitialisierung in C ++ 11 können Sie eine Kopierlisteninitialisierung durchführen, indem Sie @ schreibeA a = {1, 2};. Meiner Meinung nach sollte dies mehr oder weniger @ entsprechA a = A(1, 2);. Auf GCC und clang,A a = {1, 2} wird kompiliert, auch wenn auf das Kopieren und Verschieben von Dateien nicht zugegriffen werden kann (als privat deklariert). Immer noch,A a = 1; wird nicht auf GCC kompiliert oder klingelt, wenn auf das entsprechende Kopieren / Verschieben nicht zugegriffen werden kann. So,A a = {1, 2}; scheint mehr oder weniger äquivalent zuA a{1, 2}; ist die direkte Listeninitialisierung. Der Unterschied zwischen dieser und der realen direkten Listeninitialisierung besteht darin, dassA a = {1, 2}; wird nicht kompiliert, wenn der ctor, der zwei Ints benötigt, explizit ist. In dieser Ansicht,A a = {1, 2}; ähnelt der Kopierinitialisierung.

Also, meine Frage ist: Was ist die genaue Semantik von Ausdrücken wieA a = {1, 2}; konzeptuell? Durch konzeptuell, Kopie elision nicht im Weg bleiben.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage