为什么编译器支持多余的范围限定条件,这是合法的吗?

我在两个编译器上进行了testing,并且很惊讶地发现两者都支持以下定义而没有投诉:

class A { A(); }; A::A::A() {} ^^^ 

请注意,这也成功的方法,虽然它被标记时,声明是过分合格的。

问题:

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

更新详情:

如果原始问题不清楚或太短:我很好奇为什么在定义上允许多余的资格(重点还在上面加了)。


编译苹果公司的GCC 4.2 + LLVM

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

类名也被插入到类本身的范围中; 这被称为注入类的名称。 为了访问检查的目的,注入类名称被视为是公共成员名称。

有关导致类名注入的推理的信息,您可能需要阅读N0444 。