Schrieb den folgenden Code in VS13:Warum std :: bewegen sich nicht bewegte
std::vector<std::string> myvector(1000);
std::fill(myvector.begin(), myvector.end(), "Hello World");
std::vector<std::string> pushto;
for (auto s: myvector)
pushto.push_back(std::move(*s));
Works bewegte sich aber nicht, es Zeichenfolge kopieren ctor statt genannt. myvector
hatte am Ende noch seine "Hello World" s. Verwenden von regulären C++ 98 Iteration wie folgt aus:
std::vector<std::string> myvector(1000);
std::fill(myvector.begin(), myvector.end(), "Hello World");
std::vector<std::string> pushto;
for (auto s = myvector.begin(); s != myvector.end();s++)
pushto.push_back(std::move(*s));
Eigentlich gearbeitet und Bewegung genannt wurde. myvector
Saiten waren leer. Warum funktioniert die erste moderne Notation nicht?
Kompiliert das erste Beispiel wirklich? Ich denke nicht, dass es das '*' in 'std :: move (* s)' geben sollte. – aschepler
Beachten Sie, dass niemand gesagt hat, dass ein Zug das Original löschen sollte. Nach dem Verschieben befindet sich das Original in einem * gültigen aber nicht spezifizierten * Zustand. Selbst wenn Sie das '&' an Ort und Stelle setzen, ist es vollkommen gültig (und, imho, manchmal gewünscht), dass das ursprüngliche Objekt dieselben Werte wie das neue hat (d. H. Wie zuvor, bis modifiziert). – lorro