std :: make_shared和std :: forward - 有什么意义?

时间:2015-12-10 12:39:19

标签: 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)
{
    return shared_ptr<_Tp>::make_shared(_VSTD::forward<_Args>(__args)...);
}

我很好奇的是:

  • 为什么make_shared只接受右值参考?为什么引用常量(即const _Args &)没有过载?
  • _VSTD::forward来电有什么意义?

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

1 个答案:

答案 0 :(得分:4)

  

为什么make_shared只接受rvalue-references?为什么引用常量没有过载(即const _Args&amp;)?

这是一个universal reference,它将r值和l值绑定在一起。对于r值,推导的类型为T,对于l值,它为T&

  

_VSTD ::转发呼叫的重点是什么?

当临时绑定到r值引用时,该引用(名称)不再是r值。您需要能够恢复值的原始value category,这是std::forward<>的用途:将r值参数转换为r值,将l值参数转换为l值。

基本上std::forward&&应用于TT&。将&&应用于

  • T它变为T&& - r值引用,
  • T&变为T&&&,再次为T&