Heim > Backend-Entwicklung > C++ > Wann löst die Rückgabe eines Objekts nach Wert einen Verschiebungskonstruktor aus?

Wann löst die Rückgabe eines Objekts nach Wert einen Verschiebungskonstruktor aus?

Patricia Arquette
Freigeben: 2024-11-04 08:51:30
Original
415 Leute haben es durchsucht

When Does Returning an Object by Value Trigger a Move Constructor?

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:

  • Der zurückgegebene Ausdruck ein X-Wert ist (ein Ausdruck, der ein temporäres Objekt bezeichnet, das kein L-Wert ist).
  • Die Klasse des Das zurückgegebene Objekt verfügt über einen Verschiebungskonstruktor.
  • Auf den Verschiebungskonstruktor kann zugegriffen werden.

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&amp; z) { printf("test(const test&amp;z)\n"); }
};
test Some_thing() {
    test i;
    return i;
}</code>
Nach dem Login kopieren

Ausgabe:

test()
test(const test&amp;z)
Nach dem Login kopieren

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&amp;&amp; s) { printf("test(test&amp;&amp; s)\n"); }
};
test Some_thing() {
    test i;
    return i;
}</code>
Nach dem Login kopieren

Fazit
test()
test(test&amp;&amp; s)
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage