我试图理解为什么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
来电有什么意义?良好的解释或良好的超链接都将受到高度赞赏。
答案 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
将&&
应用于T
或T&
。将&&
应用于
T
它变为T&&
- r值引用,T&
变为T&&&
,再次为T&
。