¿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 7.3.1.1 / 2 del estándar C++ dice:

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

No entiendo por qué un espacio de nombres sin nombre se considera una alternativa superior? ¿Cuál es la razón? 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 tipos definidos por el usuario, como describí en mi respuesta ? ¿O hay algún otro ¿razón también, que desconozco? Estoy preguntando esto, particularmente porque ese es mi razonamiento en mi respuesta, mientras que el estándar podría tener algo más en mente.

Author: Community, 2011-02-12

4 answers

  • Como has mencionado, el espacio de nombres funciona para cualquier cosa, no solo para funciones y objetos.
  • Como Greg ha señalado, static ya significa demasiadas cosas.
  • Los espacios de nombres proporcionan una forma uniforme y consistente de controlar la visibilidad en el ámbito global. No tienes que usar diferentes herramientas para lo mismo.
  • Cuando se utiliza un espacio de nombres anónimo, el nombre de la función / objeto se alterará correctamente, lo que le permite ver algo como " (anónimo namespace):: xyz" en la tabla de símbolos después de des-mangling, y no solo "xyz" con enlace estático.
  • Como se señala en los comentarios a continuación, no está permitido usar cosas estáticas 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 mismo.
 86
Author: Sergei Tachenov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-12 14:12:03

Una razón puede ser que static ya tiene demasiados significados (puedo contar al menos tres). Dado que un espacio de nombres anónimo puede encapsular cualquier cosa, incluidos los tipos, parece superior a la solución static.

 9
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-12 09:10:18

Creo que hay dos razones:

  • 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...
  • los espacios de nombres sin nombre permiten declarar nuevo struct, class y typedef

Una nota sin embargo, el comité dio marcha atrás en esto: static ya no está marcado como obsoleto en n3225.

 5
Author: Matthieu M.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-12 18:08:06

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

 3
Author: Crazy Eddie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-12 14:06:21