C++声明中的显式限定

Hec*_*tor 6 c++ namespaces declaration qualified-name language-lawyer

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

namespace Y
{
    //void foo();
    void ::Y::foo(){}
}
Run Code Online (Sandbox Code Playgroud)

标准中的相关部分(§8.31)说:

当declarator-id被限定时,声明应引用先前声明的成员

据我所知,此规则可防止将名称引入其他名称空间.我想知道是否可以放宽该规则以允许引用当前命名空间的qualified-id.

Col*_*mbo 4

CWG #482相关:

\n\n
\n

根据8.3[dcl.meaning]第1段,[\xe2\x80\xa6]
\n 此限制禁止如下示例:

\n\n
void f();\nvoid ::f();        // error: qualified declarator\n\nnamespace N {\n  void f();\n  void N::f() { }  // error: qualified declarator\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

似乎没有任何充分的理由禁止此类声明,并且尽管标准禁止,但许多实现仍接受它们。是否应该更改标准以允许它们?

\n\n

2006 年 4 月会议记录:

\n\n

在讨论问题548时时,CWG 同意应删除其命名空间内限定声明符的禁令。

\n
\n\n

因此,如果存在第一个声明,则您的代码是有效的foo(截至 2012 年左右;GCC 有一个开放的错误报告)。但是,如果不是,您引用的措辞仍然适用,并使合格声明格式不正确。我认为没有理由允许这种情况发生;它直观地意味着该名称已经被声明,因为限定名称查找必须确定它所指的内容。

\n