remove_reference如何禁用模板参数扣除?

时间:2016-05-24 15:37:06

标签: c++ templates c++11 perfect-forwarding

根据this linkstd::forwardstd::remove_reference禁止的模板参数扣除正在帮助我们实现这一目标。但是如何使用remove_reference来防止模板扣除在这里发生?

template <class S>
S&& forward(typename std::remove_reference<S>::type& t) noexcept
{
    return static_cast<S&&>(t);
}

1 个答案:

答案 0 :(得分:6)

表达式S中的

typename std::remove_reference<S>::type非推断的上下文(特别是因为S出现在嵌套名称说明符 qualified-id 指定的类型的em>。顾名思义,非推断的上下文是无法推导出模板参数的上下文。

本案例提供了一个理解原因的简单示例。说我有:

int i;
forward(i);

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

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