Объявление локальной функции внутри пространства имен

В такой ситуации

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

Должна ли функция another_function быть определенным внутри пространства имен n или снаружи? VS 2012 (с Ноябрь ОСАГО) говорит, что он должен быть снаружи, а GCC 4.7.2 на Mac говорит, что он должен быть внутри. Если я ошибаюсь, я получаю неопределенные ошибки символов от компоновщиков.

Я обычно верю, что GCC более соответствует стандарту, но это C ++, и вы никогда не можете быть уверены.

6

Решение

C ++ 11 3.5 (а также C ++ 03)

7 Когда объявление области видимости объекта со связью не найдено
чтобы ссылаться на какое-то другое объявление, то эта сущность является членом
самое внутреннее вмещающее пространство имен. Однако такая декларация не
введите имя члена в его область имен.

Объявление в вашем примере объявляет n::another_function,

11

Другие решения

Согласно 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
}
}

— конец примера]

3

По вопросам рекламы [email protected]