it-swarm-ru.tech

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

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

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

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

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

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

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

9
Greg Hewgill

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

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

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

6
Matthieu M.

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

4
Crazy Eddie