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>
Dieses Beispiel gibt ein Objekt vom Typ test by value mit den folgenden Konstruktoren zurück:
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:
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>
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:
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>
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!