1

我试图理解为什么 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)...);
}

我很好奇的是:

  • 为什么make_shared只接受右值引用?为什么引用常量(即 )没有重载const _Args &
  • 打电话的意义_VSTD::forward何在?

好的解释或好的超链接都将受到高度赞赏。

4

1 回答 1

4

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

这是一个通用引用,它同时绑定到 r 值和 l 值。对于 r 值,推导的类型是T,对于 l 值,它是T&

_VSTD::forward 呼叫有什么意义?

当一个临时值绑定到一个右值引用时,该引用(名称)不再是右值。您需要能够恢复值的原始值类别,这就是std::forward<>:将 r 值参数作为 r 值转发,将 l 值参数作为 l 值转发。

本质上std::forward适用&&Tor T&。什么时候&&适用于

  • T它变成T&&- r 值参考,并且
  • T&变成T&&&了,又是T&
于 2015-12-10T13:26:16.287 回答