根据this link,std::forward
和std::remove_reference
禁止的模板参数扣除正在帮助我们实现这一目标。但是如何使用remove_reference
来防止模板扣除在这里发生?
template <class S>
S&& forward(typename std::remove_reference<S>::type& t) noexcept
{
return static_cast<S&&>(t);
}
答案 0 :(得分:6)
S
中的 typename std::remove_reference<S>::type
是非推断的上下文(特别是因为S
出现在嵌套名称说明符使用 qualified-id 指定的类型的em>。顾名思义,非推断的上下文是无法推导出模板参数的上下文。
本案例提供了一个理解原因的简单示例。说我有:
int i;
forward(i);
S
会是什么?它可以是int
,int&
或int&&
- 所有这些类型都会为函数生成正确的参数类型。编译器根本不可能确定你真正想要的 S
- 所以它不会尝试。它是不可推导的,因此您必须明确提供您所指的S
:
forward<int&>(i); // oh, got it, you meant S=int&