¿Por qué un espacio de nombre sin nombre es una alternativa “superior” a la estática?

La sección $ 7.3.1.1 / 2 del Estándar C ++ dice:

El uso de la palabra clave estática está en desuso al declarar objetos en un ámbito de espacio de nombres; el espacio de nombre sin nombre proporciona una alternativa superior.

No entiendo por qué un espacio de nombre sin nombre se considera una alternativa superior. ¿Cuál es el razonamiento? He sabido durante mucho tiempo lo que dice el estándar, pero nunca lo he pensado seriamente, incluso cuando respondía a esta pregunta: ¿ Superioridad del espacio de nombres sin nombre sobre la estática?

¿Se considera superior porque también se puede aplicar a los tipos definidos por el usuario, como describí en mi respuesta ? ¿O hay alguna otra razón que desconozco? Pregunto esto, particularmente porque ese es mi razonamiento en mi respuesta, mientras que el estándar podría tener otra cosa en mente.

  • Como ha mencionado, el espacio de nombres funciona para cualquier cosa, no solo para funciones y objetos.
  • Como Greg ha señalado, la static significa demasiadas cosas.
  • Los espacios de nombre proporcionan una forma uniforme y consistente de controlar la visibilidad en el ámbito global. No tiene que usar diferentes herramientas para lo mismo.
  • Al usar un espacio de nombres anónimo, el nombre de la función / objeto se truncará correctamente, lo que le permite ver algo como “(espacio de nombres anónimo) :: xyz” en la tabla de símbolos después de eliminar el mapa, y no solo “xyz” con enlaces estáticos .
  • Como se señala en los comentarios a continuación, no está permitido usar elementos estáticos como argumentos de plantilla, mientras que con espacios de nombres anónimos está bien.
  • ¿Más? Probablemente, pero no puedo pensar en nada más ahora.

Una razón puede ser que la static ya tiene demasiados significados (puedo contar al menos tres). Dado que un espacio de nombre anónimo puede encapsular todo lo que incluye tipos, parece superior a la solución static .

Hay dos razones por las que pienso:

  • static tiene dos significados diferentes: en el ámbito de clase, significa compartido por toda la clase, mientras que en el ámbito de archivo / función afecta a la visibilidad / almacenamiento …
  • espacios de nombres sin nombre permiten declarar nueva struct , class y typedef

Una nota, sin embargo, el comité retrocedió sobre esto: static ya no está marcado como obsoleto en n3225 .

Independientemente de las razones que tuvieran, cambiaron de opinión: http://crazycpp.wordpress.com/2011/01/18/static-keyword-is-back/