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

<p>раздел $ 7.3.1.1/2 из стандарта c++ гласит:</p><blockquote> <p>использование статического ключевого слова не рекомендуется при объявлении объектов в области пространства имен; пространство неназванных имен обеспечивает <strong> превосходную альтернативу. </strong></p> </blockquote><p>я не понимаю, почему безымянное пространство имен считается лучшей альтернативой? каково обоснование? я давно знал, что говорится в стандарте, но я никогда серьезно не задумывался об этом, даже когда отвечал на этот вопрос: <a href="https://stackoverflow.com/questions/4422507/superiority-of-unnamed-namespace-over-static">превосходство безымянного пространства имен над статическим?</a> </p><p>считается ли он превосходным, потому что его можно применять и к пользовательским типам, как я описал в моем <a href="https://stackoverflow.com/questions/4422507/superiority-of-unnamed-namespace-over-static/4422554#4422554">ответ</a> ? или есть и другая причина, о которой я не знаю? я спрашиваю об этом, особенно потому, что это мой аргумент в моем ответе, в то время как стандарт может иметь в виду что-то еще.</p>

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

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

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

<p>какими бы ни были причины, они передумали: <a href="http://crazycpp.wordpress.com/2011/01/18/static-keyword-is-back/">http://crazycpp.wordpress.com/2011/01/18/static-keyword-is-back/</a> </p>