移动使用无效?
Invalid use of move?
有人能告诉我为什么这段代码没有输出任何东西吗?
我假设它与移动线有关...
#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 << " ";
}
更新:所以我添加了系统("pause");帮助自己。我是否需要它不是我关注的重点。当我在 Visual Studio 2013 年再次 运行 代码时,它起作用了。但是,当我使用 C++14 通过 Ideone 运行 它时,它没有输出任何内容。现在有点迷茫。
使用 xvalue
参数调用的标准库函数可能假定参数是对该对象的唯一引用;如果它是从 lvalue
和 std::move
构造的,则不进行别名检查。特别是,这意味着标准库移动赋值运算符不必执行 self-assignment 检查:
std::vector<int> v = {2, 3, 3};
v = std::move(v); // undefined behavior
详情请参考std::move and this question
我不得不说这是不可复制的。
我用的是 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" 的编译器决定不检查 self-move 分配并决定释放矢量数据。
正如我们从 this little experiment 中看到的那样,在移动之后向量大小为 0。如其他先前 answers/comments 中所述,将移动分配给自身是实现定义的。我想 VC++ 在这种情况下做对了。
编辑 2:
看来 GCC 确实 doesn't check for self asignment. 将矢量数据移动到一个临时数据中,并获取 __x
数据,该数据在那个时候已经是空的。伙计,有时候 GCC 的行为很愚蠢只是为了错误的感觉性能(因为 cmp + jz 真的会减慢你的程序速度吗?拜托。)
有人能告诉我为什么这段代码没有输出任何东西吗? 我假设它与移动线有关...
#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 << " ";
}
更新:所以我添加了系统("pause");帮助自己。我是否需要它不是我关注的重点。当我在 Visual Studio 2013 年再次 运行 代码时,它起作用了。但是,当我使用 C++14 通过 Ideone 运行 它时,它没有输出任何内容。现在有点迷茫。
使用 xvalue
参数调用的标准库函数可能假定参数是对该对象的唯一引用;如果它是从 lvalue
和 std::move
构造的,则不进行别名检查。特别是,这意味着标准库移动赋值运算符不必执行 self-assignment 检查:
std::vector<int> v = {2, 3, 3};
v = std::move(v); // undefined behavior
详情请参考std::move and this question
我不得不说这是不可复制的。
我用的是 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" 的编译器决定不检查 self-move 分配并决定释放矢量数据。 正如我们从 this little experiment 中看到的那样,在移动之后向量大小为 0。如其他先前 answers/comments 中所述,将移动分配给自身是实现定义的。我想 VC++ 在这种情况下做对了。
编辑 2:
看来 GCC 确实 doesn't check for self asignment. 将矢量数据移动到一个临时数据中,并获取 __x
数据,该数据在那个时候已经是空的。伙计,有时候 GCC 的行为很愚蠢只是为了错误的感觉性能(因为 cmp + jz 真的会减慢你的程序速度吗?拜托。)