移动使用无效?

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 参数调用的标准库函数可能假定参数是对该对象的唯一引用;如果它是从 lvaluestd::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 真的会减慢你的程序速度吗?拜托。)