не-встроенное пространство имен не может быть повторно открыто как встроенное
У меня возникла проблема с пониманием жалобы компилятора:
namespace
{
}
inline namespace
{
}
gcc говорит
встроенное пространство имен должно быть указано при первоначальном определении
и MSVC говорит, что в заголовке.
Мое замешательство вызвано моим ожиданием, что два последующих анонимных пространства имен следует рассматривать как новое объявление несвязанного нового пространства, но компилятор жалуется, что каким-то образом они связаны, как если бы он пытался расширить первое за счет второго.
1 ответ
Каждое анонимное пространство имен в единице перевода - это одно и то же пространство имен.
За:
namespace
{
struct F {};
}
namespace
{
struct G {};
}
Компилятор эффективно генерирует что-то вроде этого:
namespace __mytranslation_unit_anonymous_namespace
{
struct F {};
}
namespace __mytranslation_unit_anonymous_namespace
{
struct G {};
}
F
а также G
оба находятся в одном пространстве имен. Если вы скопируете код в новую единицу перевода, компилятор сгенерирует новое имя пространства имен, например__mytranslation_unit2_anonymous_namespace
.