转发引用是否可以使用别名模板进行别名处理



这是我上一个问题的延续:

身份别名模板可以作为转发引用吗?

以下代码似乎适用于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

因为函数参数的类型是相同的,不管无论是直接写的还是通过别名模板写的,推导必须在这两种情况下都以相同的方式处理。

最新更新