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

В разделе 7.3.1.1 / 2 раздела C ++ Standard говорится:

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

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

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

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

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

Я думаю, что есть две причины:

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

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

Какими бы ни были причины, они изменили свое мнение: http://crazycpp.wordpress.com/2011/01/18/static-keyword-is-back/

  • Как определить версию стандарта C ++, используемую компилятором?
  • Контейнеры стандартной библиотеки с дополнительными параметрами шаблона?
  • Каковы новые возможности в C ++ 17?
  • Почему стандарты C или C ++ явно не определяют символ как подписанный или неподписанный?
  • Что может C / C ++ «потерять», если они определяют стандартный ABI?
  • Являются ли std :: векторные элементы гарантированными смежными?
  • Что такое оператор «->» в C ++?
  • Является ли законным возвращаться в main () на C ++?
  • Почему стандартные iteratorы диапазона вместо ?
  • В чем разница между __PRETTY_FUNCTION__, __FUNCTION__, __func__?
  • Базовый указатель на массив производных объектов
  • Давайте будем гением компьютера.