我尝试在嵌套名称说明符中使用不完整类型,如下所示:
class A;
int b= A::c; // error: incomplete type ‘A’ used in nested name specifier
class A {
static const int c=5;
};
在N3797工作草案的3.4.3 / 1中没有提及它:
可以引用类或命名空间成员或枚举器的名称 在:: scope resolution operator(5.1)应用于之后 nested-name-specifier,表示其类,名称空间或 枚举
那个行为实现依赖于什么?
答案 0 :(得分:36)
标准中有几个地方隐含暗示您的代码格式不正确,但以下引文不言自明:
3.3.2p6
宣言点[basic.scope.pdecl]
在声明类成员之后,可以在其类的范围内查找成员名称。
您的代码问题并不是您尝试到达不完整类型的正文内部,问题是您只能在之后引用类成员名称声明。
由于您的前瞻性声明(当然)并未引入任何名为 c 的成员,因此引用此类名称的形式不明确。
gcc 和 clang 在提供代码时发出的诊断有点误导,老实说我觉得错误报告是有序的。
foo.cpp:3:8: error: incomplete type 'A' named in nested name specifier
我们 允许在嵌套名称说明符中命名一个不完整的类型,但是如上所述;我们不允许引用尚未申报的成员。
非法的构造:
class X {
static int a[X::x]; // ill-formed, `X::x` has not yet been declared
static int const x = 123;
};
合法的:
class X {
int const x = 123;
int a[X::x]; // legal, `X` is incomplete (since we are still defining it)
// but we can still refer to a _declared_ member of it
};