类型名称,类型成员和非成员类型:是有效的代码?

天顶

考虑以下代码:

struct S {
    struct type {};
    type type;
};

int main() {  
    typename S::type t;
    (void) t;
}

除了不是一个好主意的事实外,我在这里阅读了关于SO的另一个问题后还在进行实验。
我发现,片段上方的编制与海湾合作委员会没有任何错误,它是由铛3.9拒绝与以下错误:

错误:类型名称说明符引用“ S”中的非类型成员“类型”

我怀疑铛就在这种情况下,和GCC是错误的(实际上,我打开一个问题是后者)。
是正确的结论还是对的有效使用typename


注意:我不是在问如何解决它,我知道该怎么做。我问仅当此代码是否有效。

cpplearner

[temp.res] / 4

即使存在,也可以使用通常的限定名称查找来找到限定IDtypename

也就是说,与elaborated-type-specifier情况不同,在这种情况下,名称查找不会忽略非类型名称。

[temp.res] / 3

如果合格-ID类型名称说明符并不表示一个类型或类模板,是形成不良的程序。

因此,在讨论的方案是形成不良。

[temp.res] / 4也有一个示例:

struct A {
  struct X { };
  int X;
};
struct B {
  struct X { };
};
template<class T> void f(T t) {
  typename T::X x;
}
void foo() {
  A a;
  B b;
  f(b);             // OK: T::X refers to B::X
  f(a);             // error: T::X refers to the data member A::X not the struct A::X
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章