这是我上一个问题的延续:
身份别名模板可以作为转发引用吗?
以下代码似乎适用于Clang 3.7.0(演示)和GCC 6.0.0(演示):
template <class T>
using forwarding_reference = T&&;
template <class T>
void foo(forwarding_reference<T>) {}
int main()
{
int i{};
foo(i);
foo(1);
}
编译器用别名模板代替转发引用是正确的吗?这可能是一种奇特的写作方式?
这确实符合标准。§14.5.7/2:
当模板id引用别名模板的专用化时,它等价于通过替换其模板参数,用于别名模板
现在,考虑在模板参数推导过程中,只检查参数的类型(就模板参数而言)-§14.8.2.1/1:
模板参数推导是通过比较每个函数来完成的模板参数类型(称为
P
)调用的相应自变量(称为A
),如下所述。
根据第一个引号,参数的类型,即forwarding_reference<T>
,等效于T&&
。因此CCD_ 5就是CCD_。
委员会在一份关于该确切场景的缺陷报告中得出了同样的结论,#1700:
因为函数参数的类型是相同的,不管无论是直接写的还是通过别名模板写的,推导必须在这两种情况下都以相同的方式处理。