函数定义为限定id

时间:2014-05-24 19:59:32

标签: c++ namespaces

为什么成功编译以下代码:

#include <stdio.h>

namespace B
{
    void foo();
    int i=3;
}

void B::foo()
{
    i=65;
}
int main(){ }

并且未成功编译以下内容:

#include <stdio.h>

namespace B
{
    void foo()
    {
        i=65;//error: ‘i’ was not declared in this scope
    }
    int i=3;
}

int main(){ }

我想从标准中找到一个澄清的时刻。

2 个答案:

答案 0 :(得分:3)

因为你需要引号3.4.1 [basic.unqual.lookup]:

  

/ 4在全局范围内使用的名称,在任何函数,类或用户声明的命名空间之外,应在全局范围内使用之前声明。

     

/ 6在函数的declarator-id28之后的函数定义中使用的名称是名称空间N的成员(其中,仅用于说明的目的,N可以表示全局作用域)在使用之前应声明在使用它的块中或在其中一个封闭块(6.3)中,或者在它在命名空间N中使用之前声明,或者,如果N是嵌套命名空间,则应在其在N的封闭命名空间之一中使用之前声明

答案 1 :(得分:1)

在第一个示例中,foo在名称空间B中声明,因此将首先在其名称空间内搜索i(并找到这样的i,因为foo的实现是在i的名称空间声明之后。在第二个示例中,您在i的定义后声明foo,因此f不会&#34;请参阅&#34; i