在这种情况下
namespace n {
void f() {
void another_function();
}
}
如果该功能another_function
被命名空间中定义n
或外部? VS 2012(与十一月CTP )说,这应该是外面,GCC 4.7.2在Mac上说,这应该是里面。 如果我错了,我得到由接头未定义的符号错误。
我一般相信GCC更加符合标准,但是这是C ++,你永远无法确定。
在这种情况下
namespace n {
void f() {
void another_function();
}
}
如果该功能another_function
被命名空间中定义n
或外部? VS 2012(与十一月CTP )说,这应该是外面,GCC 4.7.2在Mac上说,这应该是里面。 如果我错了,我得到由接头未定义的符号错误。
我一般相信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 } }
末端示例]