类型名、类型成员和非类型成员:它是有效的代码吗?

2024-02-03

考虑以下代码:

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

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

除了这远不是一个好主意之外,我在阅读了有关 SO 的另一个问题后进行了实验。
我发现上面的片段是GCC 编译无错误 https://godbolt.org/g/eErtDr它是被 clang 3.9 拒绝 https://godbolt.org/g/Li65kz出现以下错误:

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

我怀疑在这种情况下 clang 是正确的,而 GCC 是错误的(实际上,我正在向后者提出问题)。
这是正确的结论还是有效的使用typename?


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


[温度分辨率]/4 http://eel.is/c++draft/temp.res#4:

通常的限定名称查找用于查找合格的 ID即使在存在的情况下typename.

也就是说,与以下情况不同详细类型说明符s,这种情况下的名称查找不会忽略非类型名称。

[温度分辨率]/3 http://eel.is/c++draft/temp.res#3:

If the 合格的 ID in a 类型名称说明符不表示类型或类模板,该程序格式错误。

因此,该程序的格式不正确。

[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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类型名、类型成员和非类型成员:它是有效的代码吗? 的相关文章

随机推荐