【问题标题】:Can't understand the implementation of std::move无法理解 std::move 的实现
【发布时间】:2016-06-24 22:49:04
【问题描述】:

这是std::move() 的可能实现。不完全符合标准的细节,但非常接近:

template<class T>
typename std::remove_reference<T>::type&&
myMove( T&& Arg )
{   
    return ( ( typename std::remove_reference<T>::type&& )Arg );
}

我不明白为什么如果我们将typename std::remove_reference&lt;T&gt;::type&amp;&amp; 替换为T&amp;&amp; 会不起作用,即

template<class T>
typename std::remove_reference<T>::type&&
myMove( T&& Arg )
{   
    return ( (T&&) Arg );
}

【问题讨论】:

标签: c++ move-semantics


【解决方案1】:

问题不在于移动,而是T&amp;&amp; 发生的引用崩溃。

关于这个here 和这些问答herehere 的文章很好。

我将专注于演员 (T&amp;&amp;) 以及为什么这不起作用。

鉴于上面列出的参考折叠规则;

  • T&amp; &amp; 变为 T&amp;
  • T&amp; &amp;&amp; 变为 T&amp;
  • T&amp;&amp; &amp; 变为 T&amp;
  • T&amp;&amp; &amp;&amp; 变为 T&amp;&amp;

T 被推断为左值引用时,问题就出现了,然后T&amp;&amp; 变为T&amp; &amp;&amp;,它折叠为T&amp;,给定转换,您只需将其转换回左值引用而您没有获得了使移动发生的右值引用。

std::remove_reference&lt;T&gt;::type 用于删除所有引用,&amp;&amp; 然后添加右值 ref,从而确保进行正确的转换。

typename 用于消除成员变量对成员类型的歧义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2018-07-05
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 2015-05-03
    相关资源
    最近更新 更多