Heim >Backend-Entwicklung >C++ >Warum wird mein C 11 Move Constructor in diesem Fall nicht aufgerufen?
Betrachten Sie die folgende Klasse:
<code class="cpp">class X { public: explicit X(char* c) { cout <p>Und seine Verwendung:</p> <pre class="brush:php;toolbar:false"><code class="cpp">X x("test"); cout <p>Die Ausgabe ist:</p> <pre class="brush:php;toolbar:false">ctor test copy test ctor <p>In VS2010 würde man bei Verwendung der Standardeinstellungen erwarten, dass das letzte Objekt (z) bewegungskonstruiert wird und nicht standardmäßig. konstruiert. Die Verwendung von X z( move(X("test")) ) führt zur erwarteten Ausgabe: ctor move test. Könnte dies ein Fall von NRVO sein?</p><h3>Frage</h3><p>Sollte der Verschiebungskonstruktor gemäß dem C 11-Standard aufgerufen werden? Wenn ja, warum heißt es nicht?</p><h3>Antwort</h3><p>Das beobachtete Verhalten ist auf Kopierelision zurückzuführen. Der Compiler kann ein temporäres Objekt direkt in ein Ziel konstruieren, in das es kopiert/verschoben werden soll, wodurch die Aufrufe des Kopier-/Verschiebekonstruktors und des Destruktors entfallen.</p><p>Die Situationen, in denen Kopierelision angewendet werden kann, sind in §12.8 beschrieben. 32 des C 11-Standards:</p>
In diesem Fall ist der Compiler in der Lage, den Kopier- oder Verschiebungsvorgang zwischen dem temporären X („test“) und dem Ziel z zu unterlassen, was zu dem beobachteten Verhalten führt.
Das obige ist der detaillierte Inhalt vonWarum wird mein C 11 Move Constructor in diesem Fall nicht aufgerufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!