为什么我应该明确地将 typename 传递给 std::forward?
Why should I explicitly pass typename to std::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
}
考虑std::forward实施:
template <typename T>
T&& forward(std::remove_reference_t<T>& x)
{
return static_cast<T&&>(x);
}
和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;
std::forward()
中的参数类型是:
remove_reference<T>::type
此处 T
位置位于范围解析运算符 ::
的左侧,这使其成为“non-deduced 上下文”(请参阅 non-deduced context on cppreference)。因为不是自动推导的,所以要自己提供类型。
为什么要在std::forward中明确指出模板参数的类型?
template <class T> void foo (T&& x) {
goo (x); // always an lvalue
goo (std::forward<T>(x)); // rvalue if argument is rvalue
}
考虑std::forward实施:
template <typename T>
T&& forward(std::remove_reference_t<T>& x)
{
return static_cast<T&&>(x);
}
和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;
std::forward()
中的参数类型是:
remove_reference<T>::type
此处 T
位置位于范围解析运算符 ::
的左侧,这使其成为“non-deduced 上下文”(请参阅 non-deduced context on cppreference)。因为不是自动推导的,所以要自己提供类型。