有人可以告诉我为什么这段代码没有输出任何内容吗? 我假设它与移动线有关...
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
vector<int> v{66,79,154,24,76,13,7};
v = move(v);
for(auto i: v)
cout << i << " ";
}
更新:所以我添加了系统(“暂停”);帮助自己。我是否需要它并不是我所关注的。当我在Visual Studio 2013中再次运行代码时,它工作正常。但是,当我使用C ++ 14运行Ideone时,它没有输出任何内容。现在有点困惑。
答案 0 :(得分:4)
使用xvalue
参数调用的标准库函数可以假设参数是对象的唯一引用;如果它是由带有lvalue
的{{1}}构造的,则不进行别名检查。特别是,这意味着标准库移动赋值运算符不必执行自赋值检查:
std::move
有关详细信息,请参阅std::move和this question
答案 1 :(得分:2)
我将不得不说它不可复制。
我使用了Visual Studio 2015 Update 3,输出正常:
66 79 154 24 76 13 7
此外,在VC ++实现下,将向量移动到自身没有问题:
_Myt& operator=(_Myt&& _Right)
{ // assign by moving _Right
if (this != &_Right)
{ // different, assign it
clear();
if (_Alty::propagate_on_container_move_assignment::value
&& this->get_allocator() != _Right.get_allocator())
{ // assign vector, dumping proxy
this->_Free_proxy();
this->_Myvec = _STD move(_Right._Myvec);
this->_Alloc_proxy();
}
else
this->_Myvec = _STD move(_Right._Myvec);
this->_Mysize = _Right._Mysize;
_Right._Mysize = 0;
}
return (*this);
}
从条件this != &_Right
可以看出,只有当不将向量移动到自身时才会发生移动。
编辑:
显然,用于在Ideone(GCC?)上编译“C ++ 14”的编译器决定不检查自移动分配并决定释放矢量数据。 正如我们可以从this little experiment看到的那样,在移动后,矢量大小为0.正如其他先前的答案/评论中所述,将移动分配给自身是实现定义的。我想VC ++在这种情况下是正确的。
编辑2:
看起来GCC确实doesn't check for self asignment.它将矢量数据移动到临时数据中,然后获取__x
个数据,此时数据已经为空。男人,有时GCC只是为了虚假的表现而愚蠢地行事(因为cmp + jz真的会减慢你的节目吗?请。)