6

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

namespace Y
{
    //void foo();
    void ::Y::foo(){}
}

标准中的相关部分(§8.3¶1)说:

当 declarator-id 合格时,该声明应引用先前声明的成员

我了解此规则会阻止将名称引入其他名称空间。我想知道是否可以放宽该规则以允许qualified-id引用当前命名空间。

4

1 回答 1

3

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 有一个开放的错误报告)。但是,如果不是,则您引用的措辞仍然适用,并且使合格的声明格式不正确。我认为没有理由允许这种情况;它直观地暗示该名称已经被声明,因为限定名称查找必须确定它所指的内容。

于 2015-11-11T08:49:39.217 回答