„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > 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?

Veröffentlicht am 16.11.2024
Durchsuche:773

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 von 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, daher testet der Kopierkonstruktor( const test& z) wird aufgerufen:

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;
}

Ausgabe:

test()
test(const test&z)

Beispiel 2

Im folgenden Beispiel wird das zurückgegebene Objekt i jedoch als x-Wert behandelt und der Verschiebungskonstruktor test( test&& s) wird aufgerufen, weil das Objekt temporär ist und der Verschiebungskonstruktor realisierbar ist:

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;
}

Ausgabe:

test()
test(test&& s)

Beispiel 3

Wenn kein Verschiebungskonstruktor bereitgestellt oder explizit gelöscht wird, kann die implizite Verschiebungsregel nicht angewendet werden und die Das Programm kann nicht kompiliert werden:

class test {
public:
    test(test&& z) = delete;
    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;
}

Schlussfolgerung

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.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3