Es wäre sinnlos. Sie würden das Ding in der Funktion ändern, und die Änderung wäre sofort verloren, weil das Ding tatsächlich ein vorübergehendes war.
Der Grund für den neuen Typ ergibt sich aus der Notwendigkeit, entscheiden zu können, was eigentlich ein rvalue ist und was nicht. Nur dann können Sie sie tatsächlich für die coolen Dinge verwenden, die sie benutzen.
string toupper(string && s) { // for nonconst rvalues
for(char &c : s) make_uppercase(c);
return move(s); // move s into a returned string object
}
string toupper(string const& s) { // for the rest
// calls the rvalue reference version, by passing
// an rvalue copy.
return toupper(string(s));
}
Nun, wenn Sie etwas rvalue haben und geben sie direkt an ToUpper kann der R-Wert verändert werden, weil wir die temporären ist eine Wegwerf-Sache sowieso wissen, so können wir aswell nur sie und don ändern‘ Ich muss es kopieren. Die gleiche Beobachtung wird auch für die Move-Konstruktoren und die Move-Zuweisung verwendet. Die rechte Seite wird nicht kopiert, aber ihre Sachen werden einfach weg gestohlen und zu *this
verschoben.
Wenn Sie sagen würden, dass rvalues an nicht konstante Lvalue-Referenzen binden können, dann hätten Sie keine Möglichkeit herauszufinden, ob diese am Ende auf einen lvalue (benanntes Objekt) oder einen rvalue (temporär) verweist.
Es ist wahrscheinlich wenig wissen, aber nützlich wie auch immer, können Sie lvalue oder rvalue ref-Qualifier auf eine Elementfunktion setzen. Hier ist ein Beispiel, die natürlich die bestehende Semantik rvalue Verweise auf den impliziten Objektparameter erweitert:
struct string {
string& operator=(string const& other) & { /* ... */ }
};
Nun kann man nicht mehr sagen
string() = "hello";
die verwirrend ist und nicht wirklich machen Sinn die meiste Zeit. Was die obigen &
sagt, ist, dass der Zuweisungsoperator nur für lvalues aufgerufen werden kann. Das gleiche kann für rvalues getan werden, indem &&
gesetzt wird.
Ich frage mich, warum das 3 Stimmen bekam, aber 7 Favoriten. Ich glaube nicht, dass ich jemals eine Frage favorisiert habe, ohne sie abzustimmen (es sei denn, ich hatte keine Wahl oder war gesperrt). – Zifre
Ich frage mich, warum jemand in irgendeiner Weise denkt und dann erwartet er, dass alle anderen genau das tun werden, was er tut. – user534498
Ich frage mich, warum "nett zu sein und eine Aufwertung zu geben" eine unvernünftige Erwartung ist. –