为什么编译器支持冗余范围限定,是否合法?

jus*_*tin 23 c++ scope definition

我在两个编译器上进行了测试,并且惊讶地看到它们都支持以下定义而没有抱怨:

class A {
  A();
};

A::A::A() {}
   ^^^
Run Code Online (Sandbox Code Playgroud)

请注意,这也适用于方法,尽管在声明过度限定时会对其进行标记.

问题:

  • 这是一个有效的C++程序吗?
  • 如果是这样,它的目的是什么 - 或者仅仅是副产品?

更新细节:

如果原始问题不明确或太短:我很好奇为什么在定义上允许多余的资格(重点也在上面添加).


Clang和Apple的GCC 4.2 + LLVM是编译器

Jer*_*fin 18

是的,这是允许的(§9/ 2):

类名也插入到类本身的范围内; 这被称为注入类名.出于访问检查的目的,inject-class-name被视为公共成员名称.

有关导致类名注入的原因的信息,您可能需要阅读N0444.