移动使用无效?

N. *_*eil 6 c++ move vector visual-studio

有人可以给我提示为什么这段代码没有输出任何东西?我假设它与移动线有关...

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

更新:所以我添加了系统("暂停"); 帮助自己.我是否需要它并不是我所关注的.当我在Visual Studio 2013中再次运行代码时,它工作正常.但是,当我使用C++ 14运行Ideone时,它没有输出任何内容.现在有点困惑.

Visual Studio 2013 Ideone

Dav*_*aim 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);
    }
Run Code Online (Sandbox Code Playgroud)

正如您从条件中看到的,只有当您不将向量移动到自身this != &_Right时才会发生移动。

编辑:

显然,用于在 Ideone(GCC?)上编译“C++14”的编译器决定不检查自移动分配并决定释放向量数据。正如我们从这个小实验中看到的,移动后向量大小为 0。正如之前的其他答案/评论中所述,为自身分配移动是实现定义的。我想 VC++ 在这种情况下做了正确的事情。

编辑2:

看来 GCC 确实不检查自我分配。它将矢量数据移动到临时数据中,并获取__x此时已经为空的数据。伙计,有时 GCC 的行为很愚蠢,只是为了错误的感觉性能(因为 cmp + jz 真的会减慢你的程序速度吗?拜托。)