Existe-t-il une raison spécifique pour laquelle les déclarations d’espaces de noms nestedes ne sont pas autorisées en C ++?

La norme n’autorise pas un code comme celui-ci:

namespace Hello::World { //Things that are in namespace Hello::World } 

et nécessite plutôt

 namespace Hello { namespace World { //Things that are in namespace Hello::World }} 

Quelle est la raison? Était-ce tout simplement pas pensé à l’époque, ou y a-t-il une raison spécifique pour laquelle il n’est pas inclus?

Il semble que la première syntaxe exprime plus directement dans quel espace de nom on est censé être, car la déclaration imite l’utilisation réelle de l’espace de nom dans le code ultérieur. Il en résulte également moins d’indentation si vous êtes assez malheureux pour utiliser un outil d’indentation “muet”.

La raison en est très probablement “parce que c’est ainsi que la langue a évolué”.

Au moins une proposition ( “Proposition de définition d’espaces de noms nesteds” en 2003) autorisant les définitions d’espaces de noms nesteds n’a pas été sélectionnée pour l’inclusion dans C ++ 0x.

La définition de l’espace de noms nested fait partie du brouillon de travail C ++ 17.
Ce sujet est mentionné dans la proposition en tant qu’exemple de cette fonctionnalité étant une version mise à jour originale de n4026 des programmeurs: n4230 .

Dernier projet en date: n4567 (paragraphe 7.3.1 point 10)

7.3.1 Définition de l’espace de noms

10 Une définition d’espace de noms nestede avec un spécificateur d’espace de noms englobant E, un identifiant I et un corps d’ namespace E { namespace I { B } } de namespace E { namespace I { B } } B est équivalente à l’ namespace E { namespace I { B } } de namespace E { namespace I { B } }

Exemple :

 namespace A::B::C { int i; } The above has the same effect as: namespace A { namespace B { namespace C { int i; } } } 

Support du compilateur

Depuis la version 6, GCC est activé avec -std=c++1z
Visual C ++ depuis 2015, mise à jour 3, utilisation de /std:c++latest
Clang depuis la version 3.6 activé en utilisant -std=c++1z

Je présume que vous préféreriez qu’il en soit ainsi, étant donné l’ namespace X::Y , il devrait être équivalent à “espaces de noms X {espaces de noms Y`. Ce qui semble bien à la surface, mais considérons un cas de coin:

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

Comme je l’ai dit dans ce fil “possible en double”, les noms qualifiés C ++ sont réservés pour faire référence à des entités précédemment déclarées . Cela s’applique aux deux “sources” de noms qualifiés: classes et espaces de noms.

Je pense que c’était un choix de conception.

La première syntaxe semble bonne. Je voudrais l’avoir aussi. Cependant, le second est plus structuré. Vous ne créez pas d’espaces de noms nesteds de la manière suivante:

 Hello::World::Everyone::Great { } 

Voulez-vous déclarer cela à l’avance?