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