C ++声明中的显式限定

时间:2015-11-11 00:57:41

标签: c++ namespaces declaration language-lawyer qualified-name

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

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

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

  

当declarator-id被限定时,声明应引用先前声明的成员

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

1 个答案:

答案 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),则您的代码有效。但是,如果没有,您引用的措辞仍然适用,并使合格的声明格式不正确。我认为没有理由允许这种情况;它直观地暗示了名称已经被声明,因为限定名称查找必须确定它所引用的名称。