Heim  >  Artikel  >  Backend-Entwicklung  >  Warum wird der C 11-Verschiebungskonstruktor nicht aufgerufen, wenn ein Objekt mit einem anderen Objekt instanziiert wird?

Warum wird der C 11-Verschiebungskonstruktor nicht aufgerufen, wenn ein Objekt mit einem anderen Objekt instanziiert wird?

Linda Hamilton
Linda HamiltonOriginal
2024-11-05 08:20:02645Durchsuche

Why isn't the C  11 move constructor called when instantiating an object with another object?

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:

  • Rückgabeanweisungen: Nichtflüchtige automatische Objekte mit demselben CV-unqualifizierten Typ wie der Funktionsrückgabetyp können direkt in den Rückgabewert eingebaut werden.
  • Auslöseausdrücke: Nichtflüchtige automatische Objekte, deren Gültigkeitsbereich nicht über den innersten umschließenden Try-Block hinausgeht, können direkt in das Ausnahmeobjekt konstruiert werden.
  • Temporäre Objekte: Temporäre Objekte, die nicht an eine Referenz gebunden wurden, können direkt in Objekte mit demselben cv-unqualifizierten Typ konstruiert werden.
  • Ausnahmebehandler: Ausnahmedeklarationen eines Ausnahmebehandlers können als Aliase für die Ausnahme behandelt werden Objekt, wobei der Kopier- oder Verschiebevorgang weggelassen wird.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn