当第一个声明被注释掉时,以下命名空间定义无法编译。如果foo
的第一个声明被取消注释,那么它编译得很好。
namespace Y
{
//void foo();
void ::Y::foo(){}
}
标准中的相关部分(§8.3¶1)说:
当declarator-id被限定时,声明应引用先前声明的成员
据我所知,此规则可防止将名称引入其他命名空间。我想知道是否可以放宽该规则以允许 qualified-id 引用当前命名空间。
答案 0 :(得分:3)
CWG #482是相关的:
根据8.3 [dcl.meaning]第1段,[...]
此限制禁止以下示例:?page=1 $offset = (1-1)*2 //0 ?page=2 $offset = (2-1)*2 //2 ?page=3 $offset = (3-1)*2 //4 ?page=4 $offset = (4-1)*2 //6 - records 7 and 8 ?page=5 $offset = (5-1)*2 //8 - no records
似乎没有任何理由不允许这样做 声明,并且许多实现接受它们尽管如此 标准的禁令。是否应将标准更改为允许 它们?
2006年4月会议记录:
在讨论issue 548时,CWG同意禁止 应删除其名称空间内的限定声明符。
因此,如果存在void f();
void ::f(); // error: qualified declarator
namespace N {
void f();
void N::f() { } // error: qualified declarator
}
的第一个声明(截至2012年左右; GCC有open bug report),则您的代码有效。但是,如果没有,您引用的措辞仍然适用,并使合格的声明格式不正确。我认为没有理由允许这种情况;它直观地暗示了名称已经被声明,因为限定名称查找必须确定它所引用的名称。