Почему неназванное пространство имен является "превосходной" альтернативой статическому?
В разделе $7.3.1.1/2 из Стандарта С++ говорится:
Использование ключевого слова static устарел при объявлении объектов в область пространства имен; пространство имен без имени обеспечивает превосходную альтернативу.
Я не понимаю, почему неназванное пространство имен считается превосходной альтернативой? В чем причина? Я давно знаю, что говорит стандарт, но я никогда серьезно не думал об этом, даже когда я отвечал на этот вопрос: Превосходство неназванного пространства имен над статическими?
Является ли это превосходным, потому что он может применяться и к пользовательским типам, как я описал в своем ответе? Или есть какая-то другая причина, о которой я не знаю? Я спрашиваю об этом, особенно потому, что это мое рассуждение в моем ответе, в то время как стандарт может иметь что-то еще в виду.
Ответы
Ответ 1
- Как вы уже упоминали, пространство имен работает для чего угодно, а не только для функций и объектов.
- Как отметил Грег,
static
означает слишком много вещей.
- Пространства имен обеспечивают единообразный и последовательный способ контроля видимости в глобальном масштабе. Вам не нужно использовать разные инструменты для одного и того же.
- При использовании анонимного пространства имен имя функции/объекта будет искажено должным образом, что позволит вам увидеть что-то вроде "(анонимное пространство имен):: xyz" в таблице символов после отмены, а не только "xyz", со статической связью.
- Как указано в комментариях ниже, не разрешено использовать статические вещи в качестве аргументов шаблона, в то время как с анонимными пространствами имен это нормально.
- Более? Наверное, но сейчас я ничего не могу придумать.
Ответ 2
Одна из причин может заключаться в том, что static
уже имеет слишком много значений (я могу считать не менее трех). Поскольку анонимное пространство имен может инкапсулировать что угодно, включая типы, оно кажется выше решения static
.
Ответ 3
Я думаю о двух причинах:
-
static
имеет два разных значения: в области класса он означает общий для всего класса, а в области файлов/функций он влияет на видимость/хранение...
- неназванные пространства имен позволяют объявлять новые
struct
, class
и typedef
Одно примечание, однако, коммитет позади этого: static
больше не помечен как устаревший в n3225
.
Ответ 4
Какими бы ни были причины, они изменили свое мнение: http://crazycpp.wordpress.com/2011/01/18/static-keyword-is-back/