C++ 嵌套名称说明符中的类型不完整

C++ 嵌套名称说明符中的类型不完整,c++,language-lawyer,C++,Language Lawyer,我尝试在嵌套名称说明符中使用不完整类型,如下所示: 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中没有提及: 可以引用类或命名空间成员或枚举器的名称 在应用于 表示其类、命名空间或名称的嵌套名称说明符 列举 那么这种行为依赖于实现吗?引言 标准中有几个地方暗示您

我尝试在嵌套名称说明符中使用不完整类型,如下所示:

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中没有提及:

可以引用类或命名空间成员或枚举器的名称 在应用于 表示其类、命名空间或名称的嵌套名称说明符 列举

那么这种行为依赖于实现吗?

引言 标准中有几个地方暗示您的代码格式不正确,但下面的引用说明了这一点:

3.3.2p6
声明要点
[basic.scope.pdecl]

在类成员声明点之后,可以在其类的范围内查找成员名称

代码的问题不在于试图进入不完整类型的主体内部,而在于只能在声明类成员名后引用它

由于您的转发声明(当然)没有引入任何名为c的成员,因此引用这样的名称是不正确的


误导性的诊断。。。 gcc和clang在输入代码时发出的诊断有点误导,老实说,我觉得一个bug报告已经准备好了

foo.cpp:3:8:错误:嵌套名称说明符中命名的类型“A”不完整

我们被允许在嵌套的名称说明符中命名不完整的类型,但是如上所述;我们不允许提及尚未申报的成员

格式不正确:

法律:


您引用的部分没有说明可以在类的前向声明之后使用嵌套名称。@RSahu名称a是在使用之前声明的。这意味着这样的名称使用与引用不矛盾。注意,如3.4.1/4所述,名称A在使用前已声明:
在全局范围内使用的名称,在任何函数、类或用户声明的命名空间之外,应在其在全局范围内使用前声明。
应为类A{public const int c=5;};从形式上讲,此代码的格式错误并不是因为
A
不完整,而是因为名称
c
在使用时未在
A
的范围内声明,因此限定名称查找(3.4.3)失败。我猜想编译器的作者认为“类是不完整的”(因此,没有声明其成员,因此限定名称查找不可能成功)是一条更有用的错误消息。错误的包含循环也可能导致此问题。检查生成错误的类标题是否错误地包含在给出错误的类中。
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
};