2010-08-30 8 views
23

La norma no permite código como este:¿Existe alguna razón específica para que las declaraciones anidadas del espacio de nombres no estén permitidas en C++?

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? ¿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 estar, ya que la declaración imita el uso real del espacio de nombres en el código posterior. También da como resultado menos sangrado si tiene la mala suerte de estar usando una herramienta de sangrado de conteo de puntales "tonta".

+0

Mi único pensamiento sobre este tema es que este tipo de declaraciones se asemeja de cosas dentro de una clase. Me pregunto si habría algunas esquinas extrañas de especificar un espacio de nombres de clase frente a un espacio de nombres de espacios de nombres que se rompería con la sintaxis propuesta. – Omnifarious

+0

posible duplicado de [Declaración de múltiples espacios de nombres en C++] (http://stackoverflow.com/questions/3589204/multiple-namespace-declaration-in-c) – AnT

+10

@AndreyT: No estoy preguntando si es legal o no, sabe que es ilegal Pregunto ** por qué ** es ilegal. –

Respuesta

23

La razón es más probable "porque así es como evolucionó el lenguaje".

Ha habido al menos una propuesta ("Nested Namespace Definition Proposal" en 2003) para permitir las definiciones de espacios de nombres anidados, pero no se seleccionó para su inclusión en C++ 0x.

+3

+1 para señalar la propuesta - No estaba al tanto de eso. –

+1

Después de revisar esa propuesta y pensarlo un poco, creo que casi con certeza tienes razón. Apuesto a que no fue seleccionado solo porque el beneficio propuesto no parecía valer la molestia de obtener una propuesta a través del proceso de estandarización. – Omnifarious

+0

Aceptando la respuesta con el mayor número de votos positivos porque obviamente no puedo adivinar la verdadera respuesta aquí. –

2

Como dije en ese "posible duplicado" hilo, en C++ nombres cualificados están reservados para referirse a previamente declarados entidades. Esto se aplica a ambas "fuentes" de nombres calificados: clases y espacios de nombres.

+0

"Duplicado exacto" significa, "Esta pregunta es un duplicado exacto de otra pregunta", no "Hay una respuesta que se aplica a ambas preguntas". Pero +1 a esta respuesta. –

+4

No creo que esto lo explique suficientemente. Puede declarar previamente el espacio de nombres, pero todavía no puede usar este constructo. –

+0

Entonces, ¿estás a favor o en contra de la propuesta? Creo que Billy tenía la intención de que el espacio de nombres se declarara previamente ... – Potatoswatter

11

supongo que usted prefiere quiere que sea por lo que, dada namespace X::Y, debe ser equivalente al "espacio de nombres {X espacio de nombres y` que suena bien en la superficie de la misma, pero se considera un caso límite:.

...
namespace Hello { 
    namespace { 
     namespace World {} 
    } 
} 

// Does this refer to an existing namespace? Or does it define a new one? 
namespace Hello::World {} 
+0

+1 para señalar algo que ni siquiera sabía que era legal :) –

+6

Ese sería un espacio de nombres diferente. 'namespace Hello :: World {}' sería simplemente una abreviatura de 'namespace Hello {namespace World {}}', que ya está permitido por el idioma. –

+1

@James: ¿Entonces, básicamente, no hay forma de hacer referencia a espacios de nombres anónimos con la sintaxis anidada?Eso me parece razonable ya que realmente no hay forma de referirse directamente a un espacio de nombres anónimo de otra manera. – Omnifarious

0

Creo que fue una opción de diseño

la primera sintaxis se ve bien que me gustaría tenerlo también sin embargo, el segundo es más estructurado no se crea espacios de nombres anidados de esta manera.:

Hello::World::Everyone::Great { 

} 

¿Declararás esto de antemano?

+1

Sí, preferiría tener más clasificación de componentes de software. Los lenguajes como Java y C# permiten este tipo de sintaxis, y funciona muy bien para ellos.Ambos también incluyen bibliotecas estándar extremadamente grandes, y la jerarquía utilizada para clasificar las cosas en espacios de nombres hace que sea mucho más fácil encontrar el componente que está buscando. –

12

La definición del espacio de nombres anidado es parte del borrador de trabajo C++ 17.
Este tema se menciona en la propuesta como un ejemplo de esta característica que es una demanda de programadores original n4026 versión actualizada: n4230.

actual borrador más reciente: n4567 (párrafo 7.3.1 artículo 10)

7.3.1 Definición de espacio de nombres
...
A-espacio de nombres definición anidada con una envolvente-espacio de nombres especificador-E, identificador I y espacio de nombres de cuerpo B es equivalente a namespace 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; 
    } 
    } 
} 

Compiler Soporte

GCC desde version 6 habilitar usando -std=c++1z
Visual C++ desde 2015 update 3 habilitar el uso de /std:c++latest
Clang desde version 3.6 habilitar el uso de -std=c++1z

Cuestiones relacionadas