首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >移动语义std::move

移动语义std::move
EN

Stack Overflow用户
提问于 2011-04-03 19:45:13
回答 2查看 817关注 0票数 12

我不太理解std::move函数

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

为什么是remove_reference?有人能给我一个简单的解释吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-03 20:05:46

考虑一下如果T是一个左值引用会发生什么,例如MyClass &。在这种情况下,T &&将变为MyClass & &&,并且由于引用折叠规则,它将再次转换为MyClass &。为了获得正确的结果,typename remove_reference<MyClass&>::type&&首先从类型中删除任何引用修饰,因此将MyClass &映射到MyClass,然后将右值引用应用于它,生成MyClass &&

票数 17
EN

Stack Overflow用户

发布于 2011-04-03 19:55:51

因为对左值引用的右值引用将衰减为左值引用,而重新获取左值引用将具有与move中预期的语义不同的语义。

编辑:嗯,为什么要投反对票?看看这段代码:

代码语言:javascript
复制
template < typename T > T&& func(T&& x) { return x; }

int main()
{
        int x;

        int &y = func(x);
}

进一步阅读:http://www.justsoftwaresolutions.co.uk/cplusplus/rvalue_references_and_perfect_forwarding.html

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

https://stackoverflow.com/questions/5529382

复制
相关文章

相似问题

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