sirve - ¿Existe alguna razón específica para que las declaraciones de espacio de nombres anidadas no estén permitidas en C++?
que es using namespace std en programacion (5)
Como dije en ese hilo "posible duplicado", en C ++ los nombres calificados están reservados para referirse a entidades previamente declaradas . Esto se aplica a ambas "fuentes" de nombres calificados: clases y espacios de nombres.
El estándar no permite código como este:
namespace Hello::World {
//Things that are in namespace Hello::World
}
y en su lugar requiere
namespace Hello { namespace World {
//Things that are in namespace Hello::World
}}
¿Cuál es la razón de ser? ¿Esto simplemente no se pensó en ese momento, o hay una razón específica por la que no está incluido?
Parece que la primera sintaxis expresa más directamente en qué espacio de nombres se supone que debe haber uno, ya que la declaración imita el uso real del espacio de nombres en un código posterior. También resulta en menos sangría si es lo suficientemente desafortunado como para usar una herramienta de sangría de conteo de corchetes "tonto".
Creo que fue una elección de diseño.
La primera sintaxis se ve bien. Yo también querría tenerlo. Sin embargo, el segundo es más estructurado. No creas espacios de nombres anidados de esta manera:
Hello::World::Everyone::Great {
}
¿Declaras esto de antemano?
La definición de espacio de nombres anidado es parte del borrador de trabajo de C ++ 17.
Este tema se menciona en la propuesta como un ejemplo de que esta característica es una versión actualizada n4026 original de la demanda de los programadores : open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4230.html .
Último borrador actual: n4567 (párrafo 7.3.1, punto 10)
7.3.1 Definición del espacio de nombres
...
10 Una definición de espacio de nombres anidada con un especificador de espacio de nombres adjunto E, el identificador I y el cuerpo de nombres B es equivalente a unnamespace E { namespace I { B } }
denamespace E { namespace I { B } }
Ejemplo :
namespace A::B::C { int i; } The above has the same effect as: namespace A { namespace B { namespace C { int i; } } }
Compilador de apoyo
GCC desde la versión 6 habilita el uso de -std=c++1z
Visual C ++ desde 2015 actualización 3 habilita el uso de /std:c++latest
Clang desde la versión 3.6 habilitar usando -std=c++1z
La razón es más probable "porque así es como evolucionó el lenguaje".
Ha habido al menos una propuesta ( "Propuesta de definición de espacio de nombre anidado " en 2003) para permitir definiciones de espacio de nombre anidadas, pero no se seleccionó para su inclusión en C ++ 0x.
Supongo que preferiría que fuera así, dado que dado el namespace X::Y
, debería ser equivalente a "espacio de nombres X {espacio de nombres Y`. Esto suena bien en la superficie, pero considere un caso de esquina:
namespace Hello {
namespace {
namespace World {}
}
}
// Does this refer to an existing namespace? Or does it define a new one?
namespace Hello::World {}