В такой ситуации
namespace n {
void f() {
void another_function();
}
}
Должна ли функция another_function
быть определенным внутри пространства имен n
или снаружи? VS 2012 (с Ноябрь ОСАГО) говорит, что он должен быть снаружи, а 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 } }
— конец примера]