Почему неназванное пространство имен является "превосходной" альтернативой статическому?

В разделе $7.3.1.1/2 из Стандарта С++ говорится:

Использование ключевого слова static устарел при объявлении объектов в область пространства имен; пространство имен без имени обеспечивает превосходную альтернативу.

Я не понимаю, почему неназванное пространство имен считается превосходной альтернативой? В чем причина? Я давно знаю, что говорит стандарт, но я никогда серьезно не думал об этом, даже когда я отвечал на этот вопрос: Превосходство неназванного пространства имен над статическими?

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

Ответ 1

  • Как вы уже упоминали, пространство имен работает для чего угодно, а не только для функций и объектов.
  • Как отметил Грег, static означает слишком много вещей.
  • Пространства имен обеспечивают единообразный и последовательный способ контроля видимости в глобальном масштабе. Вам не нужно использовать разные инструменты для одного и того же.
  • При использовании анонимного пространства имен имя функции/объекта будет искажено должным образом, что позволит вам увидеть что-то вроде "(анонимное пространство имен):: xyz" в таблице символов после отмены, а не только "xyz", со статической связью.
  • Как указано в комментариях ниже, не разрешено использовать статические вещи в качестве аргументов шаблона, в то время как с анонимными пространствами имен это нормально.
  • Более? Наверное, но сейчас я ничего не могу придумать.

Ответ 2

Одна из причин может заключаться в том, что static уже имеет слишком много значений (я могу считать не менее трех). Поскольку анонимное пространство имен может инкапсулировать что угодно, включая типы, оно кажется выше решения static.

Ответ 3

Я думаю о двух причинах:

  • static имеет два разных значения: в области класса он означает общий для всего класса, а в области файлов/функций он влияет на видимость/хранение...
  • неназванные пространства имен позволяют объявлять новые struct, class и typedef

Одно примечание, однако, коммитет позади этого: static больше не помечен как устаревший в n3225.