C++11 std::make#u shared和std::forward— ;什么';重点是什么?

C++11 std::make#u shared和std::forward— ;什么';重点是什么?,c++11,move-semantics,make-shared,C++11,Move Semantics,Make Shared,我试图理解为什么std::make_shared是这样声明/实现的: template<class _Tp, class ..._Args> inline _LIBCPP_INLINE_VISIBILITY typename enable_if < !is_array<_Tp>::value, shared_ptr<_Tp> >::type make_shared(_Args&& ...__args) { r

我试图理解为什么std::make_shared是这样声明/实现的:

template<class _Tp, class ..._Args>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if
<
    !is_array<_Tp>::value,
    shared_ptr<_Tp>
>::type
make_shared(_Args&& ...__args)
{
    return shared_ptr<_Tp>::make_shared(_VSTD::forward<_Args>(__args)...);
}
模板
内联\u LIBCPP\u内联\u可见性
typename启用\u如果
<
!是数组::值,
共享ptr
>::类型
使共享(_参数&&…_参数)
{
返回共享\u ptr::使共享(\u VSTD::转发(\u参数)…);
}
我好奇的是:

  • 为什么
    make_shared
    只接受右值引用?为什么对常量(即,
    const\u Args&
    )的引用没有重载
  • \u VSTD::forward
    调用有什么意义
良好的解释或良好的超链接都将受到高度赞赏

为什么make_shared只接受右值引用?为什么对常量(即const_Args&)的引用没有重载

这是一个绑定到r值和l值的函数。对于r值,推断类型为
T
,对于l值,推断类型为
T&

转发呼叫的意义是什么

将临时对象绑定到r值引用时,该引用(名称)不再是r值。您需要能够还原值的原始值,这就是
std::forward
的目的:将r值参数作为r值转发,将l值参数作为l值转发

本质上,
std::forward
&
应用于
T
T&
。当
&
应用于

  • T
    它成为
    T&&
    -r值参考,并且
  • T&
    变为
    T&&
    ,这又是
    T&
为什么make_shared只接受右值引用?为什么对常量(即const_Args&)的引用没有重载

这是一个绑定到r值和l值的函数。对于r值,推断类型为
T
,对于l值,推断类型为
T&

转发呼叫的意义是什么

将临时对象绑定到r值引用时,该引用(名称)不再是r值。您需要能够还原值的原始值,这就是
std::forward
的目的:将r值参数作为r值转发,将l值参数作为l值转发

本质上,
std::forward
&
应用于
T
T&
。当
&
应用于

  • T
    它成为
    T&&
    -r值参考,并且
  • T&
    变为
    T&&
    ,这又是
    T&

它不是右值参考。这是一个转发参考。你需要了解完美转发。可能的复制这里有一些实现细节,不确定复制是个好主意。但是既然OP对链接很满意,就把它添加到答案中吧。谢谢你们!这绝对是我要找的。它不是右值引用。这是一个转发参考。你需要了解完美转发。可能的复制这里有一些实现细节,不确定复制是个好主意。但是既然OP对链接很满意,就把它添加到答案中吧。谢谢你们!这绝对是我一直在寻找的。