当第一个声明被注释掉时,以下命名空间定义无法编译。如果第一个声明foo
未注释,那么它编译得很好。
namespace Y
{
//void foo();
void ::Y::foo(){}
}
标准中的相关部分(§8.3¶1)说:
当 declarator-id 合格时,声明应引用先前声明的成员
我知道这条规则可以防止将名称引入其他名称空间。我想知道是否可以放宽该规则以允许合格的 IDs 指的是当前命名空间。
CWG #482 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#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 期 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#548,CWG 同意禁止
应删除其名称空间内的合格声明符。
所以如果第一个声明你的代码是有效的foo
存在(截至 2012 年左右;GCC 有一个打开错误报告 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64267)。但是,如果不是,您引用的措辞仍然适用,并使合格声明格式不正确。我认为没有理由允许这种情况发生;它直观地意味着该名称已经被声明,因为限定名称查找必须确定它所指的内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)