为什么编译器支持多余的范围限定条件,这是合法的吗?
我在两个编译器上进行了testing,并且很惊讶地发现两者都支持以下定义而没有投诉:
class A { A(); }; A::A::A() {} ^^^
请注意,这也成功的方法,虽然它被标记时,声明是过分合格的。
问题:
- 这是一个有效的C ++程序吗?
- 如果是的话,它的目的是什么?还是仅仅是一个副产品?
更新详情:
如果原始问题不清楚或太短:我很好奇为什么在定义上允许多余的资格(重点还在上面加了)。
编译苹果公司的GCC 4.2 + LLVM
是的,允许(§9/ 2):
类名也被插入到类本身的范围中; 这被称为注入类的名称。 为了访问检查的目的,注入类名称被视为是公共成员名称。
有关导致类名注入的推理的信息,您可能需要阅读N0444 。