In C ++ 11 können wir diesen Code schreiben:
struct Cat {
Cat(){}
};
const Cat cat;
std::move(cat); //this is valid in C++11
Wenn ich anrufe std::move, bedeutet dies, dass ich das Objekt verschieben möchte, dh ich werde das Objekt ändern. Das Verschieben eines constObjekts ist unvernünftig. Warum wird std::movedieses Verhalten nicht eingeschränkt? Es wird in Zukunft eine Falle sein, oder?
Hier bedeutet Falle, wie Brandon im Kommentar erwähnt hat:
"Ich denke, er meint, es" fängt "ihn hinterhältig hinterhältig, denn wenn er es nicht merkt, erhält er eine Kopie, die nicht das ist, was er beabsichtigt hat."
In dem Buch 'Effective Modern C ++' von Scott Meyers gibt er ein Beispiel:
class Annotation {
public:
explicit Annotation(const std::string text)
: value(std::move(text)) //here we want to call string(string&&),
//but because text is const,
//the return type of std::move(text) is const std::string&&
//so we actually called string(const string&)
//it is a bug which is very hard to find out
private:
std::string value;
};
Wenn std::movees verboten war, an einem constObjekt zu arbeiten, konnten wir den Fehler leicht herausfinden, oder?
CAT cat2 = std::move(cat);unter der Annahme, dass CATdie regelmäßige Zuweisung von Bewegungen unterstützt wird.
std::moveist nur eine Besetzung, es bewegt eigentlich nichts
std::movean sich macht nichts mit dem Objekt. Man könnte argumentieren,std::moveist schlecht benannt.