remove_reference如何禁用模板参数扣除

How remove_reference disable template argument deductions?

本文关键字:参数 何禁用 reference remove      更新时间:2023-10-16

根据此链接,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);
}
表达式typename std::remove_reference<S>::type中的

S非推导上下文(特别是因为S出现在使用限定id指定的类型的嵌套名称说明符中)。顾名思义,非推导上下文是指无法推导模板参数的上下文。

这个案例提供了一个简单的例子来理解为什么。假设我有:

int i;
forward(i);

S会是什么?它可以是intint&int&&——所有这些类型都会为函数生成正确的参数类型。编译器根本不可能确定您在这里真正指的是哪个S,所以它不会尝试。它是不可推导的,所以你必须明确地提供你所指的S

forward<int&>(i); // oh, got it, you meant S=int&