Почему неназванное пространство имен является «превосходной» альтернативой статическому?
В разделе 7.3.1.1 / 2 раздела C ++ Standard говорится:
Использование ключевого слова static не рекомендуется при объявлении объектов в области пространства имен; пространство имен без имен обеспечивает превосходную альтернативу.
Я не понимаю, почему неназванное пространство имен считается превосходной альтернативой? В чем причина? Я давно знаю, что говорит стандарт, но я никогда всерьез не об этом думал, даже когда я отвечал на этот вопрос: превосходство неназванного пространства имен над статикой?
- Bitshift и целое продвижение?
- Препроцессор C ++ идентичен препроцессору C?
- Является ли `long` гарантией быть как минимум 32 бит?
- Могут ли компиляторы исключать бесконечные петли?
- Эффекты ключевого слова extern для функций C
Является ли это превосходным, потому что он может применяться и к пользовательским типам, как я описал в своем ответе ? Или есть какая-то другая причина, о которой я не знаю? Я спрашиваю об этом, особенно потому, что это мое рассуждение в моем ответе, в то время как стандарт может иметь что-то еще в виду.
- Используйте CSS для автоматического добавления звездочки «обязательное поле» для формирования входных данных
- Почему компиляторы позволяют строковым литералам не быть const?
- Пространства в URL-адресах?
- Шестигранное представление цвета с альфа-каналом?
- Синтаксис JSON позволяет дублировать ключи в объекте?
- std :: вектор и непрерывная память многомерных массивов
- Имеет ли printf ("% x", 1) неопределенное поведение?
- Может ли (доменное имя) поддомены подчеркивать «_»?
- Как вы уже упоминали, пространство имен работает для чего угодно, а не только для функций и объектов.
- Как отметил Грег,
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/