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

时间:2014-06-07 07:53:06

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

  

可以引用类或命名空间成员或枚举器的名称   在:: scope resolution operator(5.1)应用于之后   nested-name-specifier,表示其类,名称空间或   枚举

那个行为实现依赖于什么?

1 个答案:

答案 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
};