首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型转换和使用std::move()有什么区别?

类型转换和使用std::move()有什么区别?
EN

Stack Overflow用户
提问于 2011-09-22 10:54:50
回答 3查看 773关注 0票数 5

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

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

代码语言:javascript
复制
 namespace std {
      template <class T>
      inline typename remove_reference<T>::type&& move(T&& x)
      {
           return x;
      }
 }

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

举个例子,

代码语言:javascript
复制
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;
}

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

提前感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-22 10:59:20

std::move被定义为一个专门的类型转换:

代码语言:javascript
复制
static_cast<typename remove_reference<T>::type&&>(t)

如果你真的想这样做,你可以这样做。但是,如果你只使用std::move,那么你所做的事情就会变得更短,每个人都会明白你在做什么。关于&& casting的规则很奇怪,所以最好只使用moveforward,如果你是这个意思的话。

票数 9
EN

Stack Overflow用户

发布于 2011-09-22 11:01:22

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

正如while循环比goto更好,C++样式转换比C样式转换更好,std::move比转换更好,因为它是一个不太通用的工具,因此更容易理解它正在做什么,而不需要进一步研究代码的结构。

票数 5
EN

Stack Overflow用户

发布于 2011-09-22 11:00:40

是的,std::move在功能方面什么也不做。其目的是将左值转换为x值,从而使结果可移动。它比使用强制转换更好,因为它清楚地说明了目的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7509050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档