4

这是我之前问题的延续:

身份别名模板可以作为转发参考吗?

以下代码似乎在 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);
}

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

4

1 回答 1

4

这确实符合标准。§14.5.7/2:

template-id指代别名模板的特化时, 它等价于通过将其模板参数替换为别名模板的type-id中的模板参数而获得的关联类型。

现在,考虑在模板参数推导期间,仅检查参数的类型(就模板参数而言) - §14.8.2.1/1:

模板参数推导是通过将每个函数模板参数类型(调用它P与调用的相应参数类型(调用它)进行比较来完成的,A如下所述。

根据第一个引号,参数的类型,即forwarding_reference<T>,等价于T&&。因此,在扣减P方面T&&没有区别。

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

因为函数参数的类型是一样的,不管是直接写还是通过别名模板写的,两种情况下的推导处理方式都一样。

于 2015-04-25T17:19:44.013 回答