【问题标题】:move semantics std::move移动语义 std::move
【发布时间】:2011-07-28 14:44:16
【问题描述】:

std::move这个函数我不是很懂

template <class T>
typename remove_reference<T>::type&&
move(T&& a)
{
    return a;
}

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 是的,这完全正确,但显然有人不同意:)
    • 嗯。我在你之前 10 分钟写了同样的东西,但被否决了。
    • @Let:嗯,我猜你的解释对于不熟悉右值引用的人来说有点过于简洁,不知道......
    • 对于不熟悉该主题的人来说,对答案投反对票有点奇怪。不是我在乎。我只是想指出有人不同意这种解释。
    【解决方案2】:

    因为对左值引用的右值引用会衰减为左值引用,并且返回左值引用的语义与您对move 所期望的语义不同。

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

    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

    【讨论】:

      猜你喜欢
      • 2011-07-28
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 2021-08-26
      相关资源
      最近更新 更多