类型转换和使用std :: move()之间的区别?

时间:2011-09-22 02:54:50

标签: c++ c++11 move-semantics

我对刚刚添加到最新C ++标准中的新函数std :: move()感到有些好奇。

读完一篇关于它的文章,发现函数的定义是

 namespace std {
      template <class T>
      inline typename remove_reference<T>::type&& move(T&& x)
      {
           return x;
      }
 }

这似乎与调用std :: move和使用强制转换没有任何区别。

例如,

class NPC{
    int m_number1;
    int m_number2;
public:
    NPC() : m_number1(1), m_number2(2) {
        cout << "NPC Constructor called!" << endl;
    }

    NPC(NPC&& _npc) : m_number1(_npc.m_number1), m_number2(_npc.m_number2) {
        _npc.m_number1 = 0;
        _npc.m_number2 = 0;

        cout << "NPC Move Constructor called!" << endl;
    }
};


int main() {
    NPC n1;
    NPC n2 = std::move(n1);

    cout << "----------------" << endl;
    NPC n3;
    NPC n4 = (NPC&&)n3;
    return 0;
}

认为基本上没有区别是对的吗? 好吧,我非常肯定我是对的,但也知道过于自信总是适得其反。

提前致谢!

3 个答案:

答案 0 :(得分:9)

std::move被定义为专业演员:

static_cast<typename remove_reference<T>::type&&>(t)

如果你真的想要可以这样做。但如果你只使用std::move,那么每个人所做的事情会更短更明显。围绕&amp;&amp;的规则铸造是很奇怪的,所以最好只使用moveforward这就是你的意思。

答案 1 :(得分:5)

功能上没有区别,但可读性存在差异。

正如while循环优先于goto s,并且C ++样式转换优先于C样式转换,std::move优先于转换,因为它是 less < / em>通用工具,因此无需进一步研究代码结构就更容易理解它在做什么。

答案 2 :(得分:2)

是的,std::move在功能方面没有任何作用。其目的是将左值转换为x值,使结果可移动。它比使用演员阵容更好,因为它明确了目的。