Einige Erläuterungen zu rWertreferenzen
First: wo sindstd::move
undstd::forward
definiert? Ich weiß, was sie tun, aber ich kann keinen Beweis dafür finden, dass ein Standardheader erforderlich ist, um sie einzuschließen. In gcc44 manchmalstd::move
ist verfügbar und manchmal auch nicht, daher wäre eine definitive include-Direktive nützlich.
Wenn eine Verschiebungssemantik implementiert wird, bleibt die Quelle vermutlich in einem undefinierten Zustand. Sollte dieser Zustand unbedingt ein gültiger Zustand für das Objekt sein? Offensichtlich müssen Sie in der Lage sein, den Destruktor des Objekts aufzurufen und ihm mit beliebigen Mitteln zuzuweisen, die die Klasse bereitstellt. Aber sollten andere Operationen gültig sein? Ich nehme an, ich frage Sie, ob Sie diese Invarianten erzwingen möchten, wenn Ihre Klasse bestimmte Invarianten garantiert, wenn der Benutzer angibt, dass sie ihn nicht mehr interessieren.
Next: Wenn Sie sich nicht für Bewegungssemantik interessieren, gibt es Einschränkungen, die dazu führen würden, dass eine Nicht-Konstanten-Referenz gegenüber einer R-Wert-Referenz bevorzugt wird, wenn Sie mit Funktionsparametern arbeiten?void function(T&);
Übervoid function(T&&);
Aus der Sicht eines Aufrufers ist es gelegentlich nützlich, temporäre Werte für Funktionen übergeben zu können. Es scheint also, als sollte man diese Option gewähren, wann immer dies möglich ist. Und rvalue-Referenzen sind selbst lvalues. Sie können also nicht versehentlich einen move-Konstruktor anstelle eines copy-Konstruktors oder dergleichen aufrufen. Ich sehe keinen Nachteil, aber ich bin sicher, dass es einen gibt.
Das bringt mich zu meiner letzten Frage. Sie können Provisorien immer noch nicht an Nicht-Konstanten-Referenzen binden. Sie können sie jedoch an nicht konstante Wertereferenzen binden. Und Sie können diese Referenz dann in einer anderen Funktion als Nicht-Konstanten-Referenz übergeben.
void function1(int& r) { r++; }
void function2(int&& r) { function1(r); }
int main() {
function1(5); //bad
function2(5); //good
}
Abgesehen von der Tatsache, dass es nichts tut, stimmt etwas mit diesem Code nicht? Mein Bauch sagt natürlich nichts, da das Ändern von R-Wert-Referenzen sozusagen der springende Punkt für ihre Existenz ist. Und wenn der übergebene Wert legitimerweise const ist, wird der Compiler ihn abfangen und Sie anschreien. Aber anscheinend ist dies eine Umgehung eines Mechanismus, der vermutlich aus einem bestimmten Grund eingerichtet wurde. Ich möchte nur die Bestätigung, dass ich nichts Dummes tue.