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 ++标准?
答案 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 。