转发引用可以使用别名模板别名吗?

时间:2015-04-25 16:35:06

标签: c++ templates alias c++14 forwarding-reference

这是我之前提问的延续:

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);
}

编译器是否有权使用别名模板替换转发引用,这可能是一种编写方式的奇特方式?

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&&。因此,PT&&,并且在扣除方面没有任何区别。

委员会在关于这一确切情景的缺陷报告中也得出了同样的结论,#1700

  

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