移动使用无效?

时间:2017-02-12 14:33:20

标签: c++ visual-studio vector 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 << " "; 
}

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

Visual Studio 2013 Ideone

2 个答案:

答案 0 :(得分:4)

使用xvalue参数调用的标准库函数可以假设参数是对象的唯一引用;如果它是由带有lvalue的{​​{1}}构造的,则不进行别名检查。特别是,这意味着标准库移动赋值运算符不必执行自赋值检查:

std::move

有关详细信息,请参阅std::movethis 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真的会减慢你的节目吗?请。)