Ein Objekt einer Klasse von einer Funktion nach Wert zurückgeben
Betrachten Sie den Fall, in dem Sie ein Objekt einer Klasse aus einer Funktion nach zurückgeben Wert. In diesem Szenario wird das zurückgegebene Objekt normalerweise als L-Wert betrachtet, was bedeutet, dass es einen Namen und eine Adresse im Speicher hat. Bestimmte Umstände können jedoch dazu führen, dass das zurückgegebene Objekt als R-Wert behandelt wird, ein temporäres Objekt ohne Namen oder Adresse.
Die implizite Verschiebungsregel
C definiert ein implizite Verschiebungsregel, die bei der Rückgabe eines Objekts nach Wert angewendet werden kann. Diese Regel besagt, dass, wenn die folgenden Bedingungen erfüllt sind:
In solchen Fällen wird der Verschiebungskonstruktor anstelle des Kopierkonstruktors aufgerufen. Dieses Verhalten soll die Leistung optimieren, indem unnötiges Kopieren vermieden wird.
Beispiel 1
In diesem Beispiel ist das zurückgegebene Objekt i ein L-Wert, sodass der Kopierkonstruktor test( const test& Das zurückgegebene Objekt i wird als x-Wert behandelt und der Verschiebungskonstruktor test(test&& s) wird aufgerufen, da das Objekt temporär und der Verschiebungskonstruktor realisierbar ist:
<code class="cpp">class test { public: test(int y) { printf("test(int y)\n"); } test() { printf("test()\n"); } test(const test& z) { printf("test(const test&z)\n"); } }; test Some_thing() { test i; return i; }</code>
Ausgabe:
test() test(const test&z)
Beispiel 3
Wenn kein Verschiebungskonstruktor bereitgestellt oder explizit gelöscht wird, kann die implizite Verschiebungsregel nicht angewendet werden und das Programm kann nicht kompiliert werden:
<code class="cpp">class test { public: test(int y) { printf("test(int y)\n"); } test() { printf("test()\n"); } test(test&& s) { printf("test(test&& s)\n"); } }; test Some_thing() { test i; return i; }</code>
test() test(test&& s)
Bei der Rückgabe eines Objekts nach Wert kann die implizite Verschiebungsregel unter bestimmten Bedingungen angewendet werden, was dazu führt, dass der Verschiebungskonstruktor aufgerufen wird. Das Verständnis dieses Verhaltens ist entscheidend für die Optimierung des Codes und die Vermeidung von Kompilierungsfehlern.
Das obige ist der detaillierte Inhalt vonWann löst die Rückgabe eines Objekts nach Wert einen Verschiebungskonstruktor aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!