为什么std :: move没有移动

-1 c++ c++11 visual-studio-2013

在vs13中写了以下代码:

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));
Run Code Online (Sandbox Code Playgroud)

工作,但没有移动,它称为字符串复制ctor.myvector最后还有他的"Hello World".像这样使用常规的c ++ 98迭代:

 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));
Run Code Online (Sandbox Code Playgroud)

实际上工作,并且调用了移动.myvector字符串是空的.为什么第一个更现代的符号不起作用?

Xio*_*biq 5

在您使用的第一个示例中for (auto s: myvector),s在这种情况下是当前迭代中值的副本.要完成你想要的,你应该通过参考 - for (auto& s: myvector).

注意,之后不保证字符串被清空std::move,此调用只是将其参数转换为右值引用(&&).其他std::vector::push_back具有rvalue referece 参数重载的函数(例如)可能会释放它们的argumnet资源.

  • ..即便如此,你也不能保证把旧字符串清空. (2认同)