C++声明中的显式限定

explicit qualification in C++ declaration

本文关键字:声明 C++      更新时间:2023-10-16

当第一个声明被注释掉时,以下命名空间定义无法编译。如果foo的第一个声明被取消注释,那么它编译得很好。

namespace Y
{
    //void foo();
    void ::Y::foo(){}
}

标准中的相关部分(§8.3¶1)规定:

当声明人id是合格的时,声明应引用以前声明的成员

我知道这条规则防止将名称引入其他名称空间。我想知道是否可以放宽该规则,允许限定的id引用当前命名空间。

CWG#482相关:

根据8.3【dcl.含义】第1款,【…】
此限制禁止以下示例:

void f();
void ::f();        // error: qualified declarator
namespace N {
  void f();
  void N::f() { }  // error: qualified declarator
}

似乎没有什么好的理由不允许这样做声明,尽管标准的禁令。是否应更改标准以允许他们

2006年4月会议纪要:

在讨论548问题时,CWG同意命名空间中的合格声明符应该被删除

因此,如果存在foo的第一个声明,那么您的代码是有效的(大约从2012年开始;GCC有一个打开的bug报告)。然而,如果没有,你引用的措辞仍然适用,并使限定声明格式错误。我认为没有理由允许这种情况;它直观地意味着名称已经声明,因为限定名称查找必须确定它指的是什么。