【发布时间】:2016-07-23 22:17:04
【问题描述】:
在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));
工作但没有移动,它改为调用字符串复制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));
实际上有效,并且调用了 move。 myvector 字符串为空。
为什么第一个更现代的符号不起作用?
【问题讨论】:
-
第一个例子真的可以编译吗?我认为
std::move(*s)中不应该有*。 -
请注意,没有人说过移动应该删除原件。移动后,原件处于有效但未指定状态。即使您将
&放在适当的位置,原始对象与新对象具有相同的值(即,在修改之前与以前相同)是完全有效的(并且,恕我直言,有时是需要的)。跨度>
标签: c++ c++11 visual-studio-2013