Heim > Backend-Entwicklung > C++ > Gilt bei der Rückgabe eines benannten Objekts nach Wert in C die implizite Verschiebungsregel?

Gilt bei der Rückgabe eines benannten Objekts nach Wert in C die implizite Verschiebungsregel?

Mary-Kate Olsen
Freigeben: 2024-11-07 11:00:03
Original
733 Leute haben es durchsucht

When Returning a Named Object by Value in C  , Does the Implicit Move Rule Apply?

Ein benanntes Objekt nach Wert und impliziter Verschiebungsregel zurückgeben

In C kann ein Objekt von einer Funktion entweder durch Referenz oder durch zurückgegeben werden Wert. Bei der Rückgabe nach Wert wird das Objekt je nach Kontext kopiert oder verschoben. Die implizite Verschiebungsregel wird angewendet, wenn ein Objekt als Wert von einer Funktion zurückgegeben wird, bei der das Objekt temporär ist.

Beispiel 1: Konstruktor verschieben

Betrachten Sie das folgende Beispiel:

<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(test&& s)noexcept{
            printf("test(test&& s)\n");          
    }
    test& operator=(test e) {
        printf("test& operator=(test e)\n");
        return *this;
    }
};
test Some_thing() {
    test i;
    return i;
}
int main()
{
    Some_thing();
    return 0;
}</code>
Nach dem Login kopieren

Dieses Beispiel gibt ein Objekt vom Typ test by value mit den folgenden Konstruktoren zurück:

  • test(int): Konstruktor, der ein ganzzahliges Argument akzeptiert
  • test (): Standardkonstruktor
  • test(const test&): Konstruktor kopieren
  • test(test&&): Konstruktor verschieben

Wenn die Funktion Some_thing aufgerufen wird, eine Instanz of test wird standardmäßig innerhalb der Funktion erstellt und dann zurückgegeben. Die implizite Verschiebungsregel wird angewendet und der Verschiebungskonstruktor test(test&&) wird verwendet, um das temporäre Objekt in das von der Funktion zurückgegebene Objekt zu verschieben.

Daher zeigt die Ausgabe die folgenden Schritte:

  • test()
  • test(test&& s)

Beispiel 2: Konstruktor kopieren

Betrachten wir dies nun als geändert Beispiel:

<code class="cpp">class test {
public:
    test(int y) {
        printf("test(int y)\n");
    }
    test() {
        printf("test()\n");
    }
    test(test& z) {
        printf("test(test&z)\n");
    }
    test& operator=(test e) {
        printf("test& operator=(test e)\n");
        return *this;
    }
};
test Some_thing() {
    test i;
    return i;
}
int main()
{
    Some_thing();
    return 0;
}</code>
Nach dem Login kopieren

In diesem Fall ist der Move-Konstruktor test(test&&) nicht verfügbar. Stattdessen wird der Kopierkonstruktor test(test&) verwendet, um das von der Funktion zurückgegebene temporäre Objekt in das auf dem Stapel in main erstellte Objekt zu kopieren.

Die Ausgabe zeigt die folgenden Schritte:

  • test()
  • test(test&z)

Beispiel 3: Gelöschter Move-Konstruktor

Zuletzt, wenn wir den Move explizit löschen Konstruktor wie folgt:

<code class="cpp">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(test&z)\n");
    }
    test& operator=(test e) {
        printf("test& operator=(test e)\n");
        return *this;
    }
};
test Some_thing() {
    test i;
    return i;
}
int main()
{
    Some_thing();
    return 0;
}</code>
Nach dem Login kopieren

Der Verschiebungskonstruktor kann nicht verwendet werden und die Kompilierung schlägt fehl, da kein brauchbarer Konstruktor für den Rückgabewert vorhanden ist.

Abschließend die implizite Verschiebung Die Regel wird angewendet, wenn ein Objekt einer Klasse als Wert von einer Funktion zurückgegeben wird, bei der das Objekt temporär ist. Wenn ein Verschiebungskonstruktor verfügbar ist, wird dieser verwendet. Wenn nicht, wird stattdessen der Kopierkonstruktor verwendet. Wenn der Verschiebungskonstruktor explizit gelöscht wird, schlägt die Kompilierung fehl.

Das obige ist der detaillierte Inhalt vonGilt bei der Rückgabe eines benannten Objekts nach Wert in C die implizite Verschiebungsregel?. 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