Heim  >  Artikel  >  Backend-Entwicklung  >  Warum bevorzugt die implizite Verschiebungsregel einen Kopierkonstruktor gegenüber einem Verschiebungskonstruktor, wenn der Verschiebungskonstruktor nicht verfügbar ist?

Warum bevorzugt die implizite Verschiebungsregel einen Kopierkonstruktor gegenüber einem Verschiebungskonstruktor, wenn der Verschiebungskonstruktor nicht verfügbar ist?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-05 10:36:02910Durchsuche

Why Does the Implicit Move Rule Prefer a Copy Constructor Over a Move Constructor When the Move Constructor is Unavailable?

Ein Klassenobjekt nach Wert mit impliziter Verschiebungsregel zurückgeben

Bei der Rückgabe eines Objekts einer Klasse nach Wert aus einer Funktion erfolgt die implizite Verschiebung Regel kommt ins Spiel. Diese Regel bestimmt, welcher Konstruktor zum Initialisieren des zurückgegebenen Objekts verwendet werden soll. Normalerweise wird der Verschiebungskonstruktor bevorzugt, wenn das Objekt als X-Wert betrachtet wird (ein Ausdruck, aus dem verschoben werden kann).

In Ihrem Beispiel 1 habe ich die Variable in Some_thing() deklariert. Die Funktion ist ein X-Wert, da sie in einem lokalen Bereich deklariert ist und als verschiebungsfähig gilt. Daher wird der Verschiebungskonstruktor test(test&& s) aufgerufen, wie in der Ausgabe gezeigt.

In Beispiel 2 haben Sie jedoch den Verschiebungskonstruktor entfernt und den zu testenden Kopierkonstruktor geändert (test&z). Diese Änderung führte dazu, dass in der Ausgabe der Aufruf des Kopierkonstruktors test(test& z) anstelle des Verschiebungskonstruktors angezeigt wurde, was aufgrund der impliziten Verschiebungsregel erwartet wurde.

Dieses scheinbar widersprüchliche Verhalten tritt auf, weil i immer noch berücksichtigt wird ein x-Wert, aber der Compiler betrachtet jetzt auch den „normalen“ Kopierkonstruktor als machbar. Die implizite Verschiebungsregel versucht zunächst, den Verschiebungskonstruktor zu verwenden, aber da keiner vorhanden ist, verwendet sie weiterhin den Kopierkonstruktor.

Um die Verwendung eines Verschiebungskonstruktors explizit zu erzwingen, können Sie den Kopierkonstruktor löschen , wie in Beispiel 3 gezeigt. Dies verhindert, dass der Compiler den Kopierkonstruktor als Option berücksichtigt, und der Verschiebungskonstruktor wird auch dann verwendet, wenn er als const markiert ist (was normalerweise das Verschieben verhindert).

Beispiel 4 zeigt dies Ein const-Objekt kann immer noch verschoben werden, wenn der Verschiebungskonstruktor verfügbar ist und die Verschiebungsoperation „noexclusive“ ist. In diesem Fall wird das während der Initialisierung von u erstellte temporäre Objekt nach r verschoben, was zum Aufruf des Verschiebungskonstruktors führt.

Das obige ist der detaillierte Inhalt vonWarum bevorzugt die implizite Verschiebungsregel einen Kopierkonstruktor gegenüber einem Verschiebungskonstruktor, wenn der Verschiebungskonstruktor nicht verfügbar ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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