не-встроенное пространство имен не может быть повторно открыто как встроенное

У меня возникла проблема с пониманием жалобы компилятора:

namespace
{
}

inline namespace
{
}

gcc говорит

встроенное пространство имен должно быть указано при первоначальном определении

и MSVC говорит, что в заголовке.

Мое замешательство вызвано моим ожиданием, что два последующих анонимных пространства имен следует рассматривать как новое объявление несвязанного нового пространства, но компилятор жалуется, что каким-то образом они связаны, как если бы он пытался расширить первое за счет второго.

https://godbolt.org/z/rwAYLg

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.

Другие вопросы по тегам