为什么我应该显式地将类型名传递给 std::forward?

Max*_*sky 3 c++ templates forward

为什么需要在 std::forward 中显式指示模板参数的类型?

template <class T> void foo (T&& x) {
    goo (x);                   // always an lvalue
    goo (std::forward<T>(x));  // rvalue if argument is rvalue
}
Run Code Online (Sandbox Code Playgroud)

考虑std::forward 实现

template <typename T>
T&& forward(std::remove_reference_t<T>& x)
{
    return static_cast<T&&>(x);
}
Run Code Online (Sandbox Code Playgroud)

std::remove_reference 实现

template< class T > struct remove_reference      {typedef T type;};
template< class T > struct remove_reference<T&>  {typedef T type;};

template< class T >
using remove_reference_t = typename remove_reference<T>::type;
Run Code Online (Sandbox Code Playgroud)

dan*_*dam 5

参数的类型std::forward()是:

remove_reference<T>::type
Run Code Online (Sandbox Code Playgroud)

这里的T位置是范围解析运算符的左侧::,这使其成为“非推导上下文”(请参阅​​ cppreference 上的非推导上下文)。因为它不是自动推导的,所以您必须自己提供类型。