【问题标题】:The difference between type casting and using std::move()?类型转换和使用 std::move() 的区别?
【发布时间】:2011-09-22 02:54:50
【问题描述】:

我只是对刚刚添加到最新 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;
}

认为基本没有区别对吗? 嗯,我很确定我是对的,但我也知道过于自信总是适得其反。

提前致谢!

【问题讨论】:

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


    【解决方案1】:

    std::move 被定义为专门的演员表:

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

    如果你真的想要,可以这样做。但是,如果您只使用std::move,那么对于每个人来说,您正在做什么都会变得更短更明显。 && 转换的规则很奇怪,所以最好只使用 moveforward 来表达你的意思。

    【讨论】:

      【解决方案2】:

      功能上没有区别,但可读性有区别。

      正如while 循环优于gotos,C++ 风格转换优于C 风格转换,std::move 优于转换,因为它是一个less 通用工具,因此更容易理解它在做什么,而无需进一步研究代码的结构。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 谢谢!我将使用 std::move !
        猜你喜欢
        • 1970-01-01
        • 2012-12-01
        • 2013-06-13
        • 2010-11-29
        • 2020-08-17
        • 1970-01-01
        • 1970-01-01
        • 2011-05-02
        • 1970-01-01
        相关资源
        最近更新 更多