8

在这样的情况下

namespace n {
    void f() {
        void another_function();
    }
}

函数another_function应该定义在命名空间内部n还是外部?VS 2012(带有11 月 CTP)说它应该在外面,而 Mac 上的 GCC 4.7.2 说它应该在里面。如果我做错了,我会从链接器中得到未定义的符号错误。

我通常相信 GCC 更符合标准,但这是 C++,你永远无法确定。

4

2 回答 2

13

C++11 3.5(以及 C++03)

7如果没有发现具有链接的实体的块范围声明引用其他声明,则该实体是最内层封闭命名空间的成员。然而,这样的声明并没有在其命名空间范围内引入成员名称。

您示例中的声明声明了n::another_function.

于 2013-01-03T18:38:37.663 回答
3

根据 N3485 7.3.1 [namespace.def]/6,正确答案是n::another_function.

声明的封闭命名空间是声明在词法上出现的命名空间,除了在其原始命名空间之外重新声明命名空间成员(例如,在 7.3.1.2 中指定的定义)。这样的重新声明具有与原始声明相同的封闭命名空间。[ 例子:

namespace Q {
    namespace V {
        void f(); // enclosing namespaces are the global namespace, Q, and Q::V
        class C { void m(); };
    }
    void V::f() { // enclosing namespaces are the global namespace, Q, and Q::V
        extern void h(); // ... so this declares Q::V::h
    }
    void V::C::m() { // enclosing namespaces are the global namespace, Q, and Q::V
    }
}

—结束示例]

于 2013-01-03T18:36:45.353 回答