在这样的情况下
namespace n {
void f() {
void another_function();
}
}
函数another_function
应该定义在命名空间内部n
还是外部?VS 2012(带有11 月 CTP)说它应该在外面,而 Mac 上的 GCC 4.7.2 说它应该在里面。如果我做错了,我会从链接器中得到未定义的符号错误。
我通常相信 GCC 更符合标准,但这是 C++,你永远无法确定。
在这样的情况下
namespace n {
void f() {
void another_function();
}
}
函数another_function
应该定义在命名空间内部n
还是外部?VS 2012(带有11 月 CTP)说它应该在外面,而 Mac 上的 GCC 4.7.2 说它应该在里面。如果我做错了,我会从链接器中得到未定义的符号错误。
我通常相信 GCC 更符合标准,但这是 C++,你永远无法确定。
C++11 3.5(以及 C++03)
7如果没有发现具有链接的实体的块范围声明引用其他声明,则该实体是最内层封闭命名空间的成员。然而,这样的声明并没有在其命名空间范围内引入成员名称。
您示例中的声明声明了n::another_function
.
根据 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 } }
—结束示例]