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.
CWG #482相关:
\n\n\n\n\n根据8.3[dcl.meaning]第1段,[\xe2\x80\xa6]
\n\n
\n 此限制禁止如下示例:Run Code Online (Sandbox Code Playgroud)\n\nvoid f();\nvoid ::f(); // error: qualified declarator\n\nnamespace N {\n void f();\n void N::f() { } // error: qualified declarator\n}\n
似乎没有任何充分的理由禁止此类声明,并且尽管标准禁止,但许多实现仍接受它们。是否应该更改标准以允许它们?
\n\n2006 年 4 月会议记录:
\n\n在讨论问题548时时,CWG 同意应删除其命名空间内限定声明符的禁令。
\n
因此,如果存在第一个声明,则您的代码是有效的foo
(截至 2012 年左右;GCC 有一个开放的错误报告)。但是,如果不是,您引用的措辞仍然适用,并使合格声明格式不正确。我认为没有理由允许这种情况发生;它直观地意味着该名称已经被声明,因为限定名称查找必须确定它所指的内容。
归档时间: |
|
查看次数: |
681 次 |
最近记录: |