C 11 Move-Konstruktor nicht aufgerufen, Standardkonstruktor bevorzugt
Frage:
In C 11, warum wird der Verschiebungskonstruktor beim Instanziieren eines Objekts über ein anderes Objekt möglicherweise nicht aufgerufen, wenn er sein sollte?
Antwort:
Bei der Instanziierung kann es gelegentlich vorkommen, dass der Compiler aufgerufen wird Wenden Sie eine Technik an, die als Kopierelision bekannt ist. Die Kopierelision ermöglicht die direkte Konstruktion eines temporären Objekts in das Ziel, in das es kopiert oder verschoben werden soll, unter Umgehung des Kopier- oder Verschiebungskonstruktor/Destruktor-Paares.
Der Standard erlaubt die Kopierelision unter den folgenden Umständen:
Im gegebenen Beispiel erfolgt beim Instanziieren von z mit eine Referenz. Folglich wird es direkt in z konstruiert, wobei der Verschiebungskonstruktor umgangen und z stattdessen mit dem Standardkonstruktor erstellt wird.
Der explizite Aufruf von move(X("test")) verhindert das Eliminieren von Kopien und erzwingt die Verwendung des Verschiebungskonstruktors , wie in der geänderten Ausgabe beobachtet.
Das obige ist der detaillierte Inhalt vonWarum wird der C 11-Verschiebungskonstruktor nicht aufgerufen, wenn ein Objekt mit einem anderen Objekt instanziiert wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!