是否符合C ++标准,使用`A <int> :: template B <int> x;`?</int> </int>定义变量

时间:2014-07-04 14:57:01

标签: c++ templates c++11 compiler-construction portability

gcc,vc ++和clang接受以下代码。

template<class T>
struct A
{
    template<class U>
    struct B
    {};
};

int main()
{
    A<int>::B<int> y; // OK as expected
    A<int>::template B<int> x; // Also OK! Is this standard-compliant?
};

使用A<int>::template B<int> x;定义变量是否符合C ++标准?

1 个答案:

答案 0 :(得分:12)

即使这是一个非规范性的说明,我认为答案可以由n3797 [temp.names] / 6

给出。
  

typename前缀的情况一样,在不严格必要的情况下允许使用template前缀;即,当嵌套名称说明符->.左侧的表达式不依赖于模板参数时,或者没有出现使用在模板范围内。

在OP的示例中,前缀template在模板范围之外使用,前面的嵌套名称说明符不依赖。因此,前缀template不是必需的,但在此处允许。


[expr.prim.general] / 8

  

合格-ID
  嵌套名称说明符 template opt unqualified-id

加[temp.names] / 5

  

以关键字template为前缀的名称应为 template-id ,或者名称应引用类模板。

[temp.names] / 1表示B<int>确实是(简单 - 模板ID