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


этот вопрос уже есть ответ здесь:

раздел $7.3.1.1 / 2 из стандарта C++ гласит:

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

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

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

4 76

4 ответа:

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

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

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

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

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

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