Wie kann ein bewegliches Objekt
sein?const
?
Das geht nicht, aber das sagt die Sprache nicht. Die Sprache besagt, dass ein Konstruktor mit dieser Signatur ein "move constructor" ist, aber das bedeutet nicht, dass das Argument verschoben wird, sondern dass der Konstruktor die Anforderungen eines "move constructor" erfüllt. Ein Verschiebungskonstruktor muss nichts verschieben, und wenn das Argument const
ist, kann es nicht.
Gibt es einen Fall, in dem eine solche Erklärung sinnvoll wäre?
Ja, aber nicht sehr oft. Dies kann nützlich sein, wenn Sie verhindern möchten, dass ein anderer Konstruktor durch Überladungsauflösung ausgewählt wird, wenn ein const temporary als Argument übergeben wird.
%Vor% In diesem Code stimmt das von func()
zurückgegebene temporäre Objekt nicht exakt mit den Parametern der Kopier- oder Verschiebungskonstruktoren überein. Daher wird der Template-Konstruktor aufgerufen, der einen beliebigen Typ akzeptiert. Um dies zu verhindern, können Sie eine andere Überladung mit einem konstanten Wert angeben und entweder an den Kopierkonstruktor delegieren:
Oder wenn Sie die Code-Kompilierung verhindern möchten, definieren Sie sie als gelöscht:
%Vor%Siehe Ссылка für Beispiele aus dem Standard, die eine Konstante rvalue verwenden.
Einige Hintergrundinformationen zu dieser Funktion.
Rvalue Referenzen - Aus Bjarne Stroustrups Blog
Vorschlag zum Hinzufügen der Move-Semantik-Unterstützung zur C ++ - Sprache
Eine interessante Frage. Ich habe irgendwo eine Erklärung dieser Frage von Stroustrup gelesen, kann sie aber nicht finden. Ich hoffe, das obige hilft an seiner Stelle.
Tags und Links c++ c++11 move-constructor