std::make_shared 和 std::forward — 这有什么意义?
std::make_shared and std::forward — what's the point?
我想了解为什么 std::make_shared 是 declared/implemented 的样子:
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
通话有什么意义?
非常感谢好的解释或好的超链接。
Why does make_shared accept only rvalue-references? Why there's no overload for reference-to-constant (i.e., const _Args &)?
这是一个绑定到右值和左值的 universal reference。对于右值,推导类型是 T
,对于左值,它是 T&
.
What's the point of _VSTD::forward call?
当临时对象绑定到右值引用时,该引用(名称)不再是右值。您需要能够恢复值的原始 value category,这就是 std::forward<>
的用途:将右值参数转发为右值,将左值参数转发为左值。
本质上 std::forward
将 &&
应用于 T
或 T&
。当 &&
应用于
T
变为 T&&
- r 值参考,并且
T&
变成 T&&&
,又是 T&
.
我想了解为什么 std::make_shared 是 declared/implemented 的样子:
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
通话有什么意义?
非常感谢好的解释或好的超链接。
Why does make_shared accept only rvalue-references? Why there's no overload for reference-to-constant (i.e., const _Args &)?
这是一个绑定到右值和左值的 universal reference。对于右值,推导类型是 T
,对于左值,它是 T&
.
What's the point of _VSTD::forward call?
当临时对象绑定到右值引用时,该引用(名称)不再是右值。您需要能够恢复值的原始 value category,这就是 std::forward<>
的用途:将右值参数转发为右值,将左值参数转发为左值。
本质上 std::forward
将 &&
应用于 T
或 T&
。当 &&
应用于
T
变为T&&
- r 值参考,并且T&
变成T&&&
,又是T&
.