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)...);
}

我比较好奇的是:

非常感谢好的解释或好的超链接。

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&& 应用于 TT&。当 && 应用于

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