5

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

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

提前致谢!

4

3 回答 3

9

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

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

如果你真的想要,你可以这样做。但是,如果您只使用std::move. && 强制转换的规则很奇怪,所以最好只使用它moveforward当这就是你的意思时。

于 2011-09-22T02:59:20.487 回答
5

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

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

于 2011-09-22T03:01:22.253 回答
2

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

于 2011-09-22T03:00:39.897 回答