Warum Regeln für die Rückgabe der Bewegungsreferenz, da C ++ 23 zulässiger sind?C++

Programme in C++. Entwicklerforum
Anonymous
 Warum Regeln für die Rückgabe der Bewegungsreferenz, da C ++ 23 zulässiger sind?

Post by Anonymous »

Hier ist ein MCVE: < /p>
#include

int&& foo() {
int i = 2;
return i;
}

int main() {
std::cout
Dies kompiliert nicht mit C ++ 11 zu C ++ 20, sondern kompiliert mit GCC und Clang, da C ++ 23 (nur eine Warnung auslöst) und dies führt zu undefiniertem Verhalten. cppreference.com < /p>

Notizen < /h3>
Die Rückgabe nach Wert kann die Konstruktion und Kopie eines temporären Objekts beinhalten, es sei denn, die Kopierelision wird verwendet. Specifically, the conditions for copy/move are as follows:









Automatic move from local variables and parameters
The expression is move-eligible if it is a (possibly parenthesized) identifier expression that names a variable of automatic storage duration whose type is
- a non-volatile object type
(since C++11)
< /tr>

- oder eine nicht-volatile Referenz auf Objekttyp < /td>
(da c ++ 20) < /td>
< /tr>

< /td>

und der Variable

- oder das Variable
- oder in dem von A- /A-BR />- oder ASE
-- oder A. Innerste einschließende Funktion oder Lambda-Expression. C ++ 20) < /code> oder für co_return die Überladung von Versprechen auswählen. C ++ 23) < /td>
< /tr>

- oder es war erfolgreich, wählte jedoch nicht den Bewegungskonstruktor aus (formal, der erste Parameter des ausgewählten Konstruktors war kein RValue-Referenz auf den (möglicherweise cv-qualifizierten) Typ < /td> < /td>

(seitdem cv-qualifiziert). C ++ 20) < /td>
< /tr>

- Dann wird die Überlastauflösung wie gewohnt durchgeführt, wobei der Ausdruck als LVALUE angesehen wird (so kann es den Kopierkonstruktor auswählen). />
Wenn der Ausdruck bewegungsbezogen ist, wird er als XValue behandelt (somit kann die Überlastauflösung den Bewegungskonstruktor auswählen). /> Wenn Expression ein PrValue ist, wird das Ergebnisobjekt direkt durch diesen Ausdruck initialisiert. Dies beinhaltet keinen Kopier- oder Verschiebungskonstruktor, wenn die Typen übereinstimmen (siehe Elision der Kopie). Ich habe einige Experimente unter der Annahme durchgeführt, dass dies eine größere Optimierung für NRVO ermöglichen sollte, aber diese Experimente haben nichts beweisen. /> Was war die Begründung für die Einführung dieses Unterschieds? Ich habe gerade etwas Papier gefunden, das miteinander verbunden aussieht. Ich habe das noch nicht gelesen.>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post