当第一个声明被注释掉时,以下命名空间定义无法编译。如果未注释的第一个声明foo
,那么它编译就好了。
namespace Y
{
//void foo();
void ::Y::foo(){}
}
标准中的相关部分(§8.3¶1)说:
当 declarator-id 合格时,该声明应引用先前声明的成员
我了解此规则会阻止将名称引入其他名称空间。我想知道是否可以放宽该规则以允许qualified-id引用当前命名空间。
当第一个声明被注释掉时,以下命名空间定义无法编译。如果未注释的第一个声明foo
,那么它编译就好了。
namespace Y
{
//void foo();
void ::Y::foo(){}
}
标准中的相关部分(§8.3¶1)说:
当 declarator-id 合格时,该声明应引用先前声明的成员
我了解此规则会阻止将名称引入其他名称空间。我想知道是否可以放宽该规则以允许qualified-id引用当前命名空间。
CWG #482是相关的:
根据 8.3 [dcl.meaning] 第 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 有一个开放的错误报告)。但是,如果不是,则您引用的措辞仍然适用,并且使合格的声明格式不正确。我认为没有理由允许这种情况;它直观地暗示该名称已经被声明,因为限定名称查找必须确定它所指的内容。