这是我之前提问的延续:
Can an identity alias template be a forwarding reference?
以下代码似乎适用于Clang 3.7.0(demo)和GCC 6.0.0(demo):
template <class T>
using forwarding_reference = T&&;
template <class T>
void foo(forwarding_reference<T>) {}
int main()
{
int i{};
foo(i);
foo(1);
}
编译器是否有权使用别名模板替换转发引用,这可能是一种编写方式的奇特方式?
答案 0 :(得分:4)
这确实符合标准。 §14.5.7/ 2:
当 template-id 引用别名模板的特化时, 它等同于通过替换获得的相关类型 template-id 中 template-parameters 的 template-arguments 别名模板。
现在,考虑在模板参数推导期间,仅检查参数的类型(就模板参数而言) - §14.8.2.1/ 1:
通过比较每个函数来完成模板参数推导 模板参数类型(称之为
P
),其类型为 相应的调用参数(称之为A
),如下所述。
根据第一个引用,参数的类型即forwarding_reference<T>
等同于T&&
。因此,P
为T&&
,并且在扣除方面没有任何区别。
委员会在关于这一确切情景的缺陷报告中也得出了同样的结论,#1700:
因为函数参数的类型是相同的,无论如何 无论是直接写还是通过别名模板,必须扣除 在两种情况下都以相同的方式处理。