根据这个链接 https://stackoverflow.com/questions/7779900/why-is-template-argument-deduction-disabled-with-stdforward, 不允许模板参数推导std::forward
, and std::remove_reference
正在帮助我们实现这一目标。但是如何使用remove_reference
防止模板推导发生在这里?
template <class S>
S&& forward(typename std::remove_reference<S>::type& t) noexcept
{
return static_cast<S&&>(t);
}
S
在表达式中typename std::remove_reference<S>::type
is a 非推导上下文(具体是因为S
出现在嵌套名称说明符使用指定的类型合格的 ID)。顾名思义,非推导上下文是无法推导模板参数的上下文。
这个案例提供了一个简单的例子来理解原因。假设我有:
int i;
forward(i);
什么会S
是?它可能是int
, int&
, or int&&
- 所有这些类型都会为函数产生正确的参数类型。编译器根本不可能确定which S
你真正的意思是在这里 - 所以它不会尝试。它是不可推论的,所以你必须明确提供哪个S
你的意思是:
forward<int&>(i); // oh, got it, you meant S=int&
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)