Pregunta ¿Por qué un espacio de nombres sin nombre es una alternativa "superior" a la estática? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

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

El uso de la palabra clave estática es   obsoleto al declarar objetos en una   alcance del 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? Conozco desde hace 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 nombre sin nombre sobre estático?

Se considera superior porque también se puede aplicar a tipos definidos por el usuario, como describí en mi responder? ¿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.


76
2018-02-12 09:04


origen


Respuestas:


  • Como ha mencionado, el espacio de nombres funciona para cualquier cosa, no solo para funciones y objetos.
  • Como Greg ha señalado, static significa demasiadas cosas ya.
  • 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.

85
2018-02-12 10:22



Una razón puede ser que 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 static solución.


9
2018-02-12 09:10



Hay dos razones por las que pienso:

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

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


5
2018-02-12 10:23



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


3
2018-02-12 14:06