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

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

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

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

问题:

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

更新详情:

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


编译苹果公司的GCC 4.2 + LLVM

One Solution collect form web for “为什么编译器支持多余的范围限定条件,这是合法的吗?”

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

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

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

  • 范围与浮动types的步骤
  • 如何获取当前范围/符号表中定义的所有variables?
  • PHP创build数组,其中键和值是相同的
  • 为实体创build主 - 细节页面,如何链接它们以及select哪个bean范围
  • cmakevariables作用域,add_subdirectory
  • 如何在Ruby中的a和b之间生成一个随机数字?
  • 在IntRange上调用.each {}返回范围不是每个整数
  • AngularJS:如何将参数/函数传递给指令?
  • 修改`** kwargs`字典总是安全的吗?
  • C#variables范围:'x'不能在这个范围内声明,因为它会给'x'
  • 什么是在C#lambdavariables的范围?