Remarque: cette question concerne name space
, non namespace
.
La norme C ++ a quelques références name space
, mais je ne vois pas la définition de cela. Les normes indiquent que les étiquettes et les macros se trouvent dans des espaces de noms différents. Toutes les autres références à se name space
trouvent dans la section de compatibilité C / C ++, comme ceci (version actuelle ):
Il s'agit de l'une des rares incompatibilités entre C et C ++ qui peuvent être attribuées à la nouvelle définition d'espace de nom C ++ où un nom peut être déclaré en tant que type et en tant que non-type dans une seule étendue, ce qui fait que le nom non-type masque le nom de type et nécessitant que la classe de mots clés, la structure, l'union ou l'énumération soient utilisés pour faire référence au nom de type. Cette nouvelle définition d'espace de nom offre des fonctionnalités de notation importantes aux programmeurs C ++ et aide à rendre l'utilisation des types définis par l'utilisateur aussi similaire que possible à l'utilisation des types fondamentaux.
Quelle est cette nouvelle définition d'espace de nom ? Où puis-je le trouver dans la norme? Quelles sont les règles exactes? Les règles semblent être plus compliquées que les «types de masques non-types». Comme, cela ne compile pas:
typedef int Foo; // Foo is a type
void Foo(); // not a type, but compile error, instead of hiding
Mais cela:
struct Foo { }; // Foo is a type as well
void Foo(); // This hides the type Foo. "struct Foo" refers to the type
Et cela ne compile pas non plus:
struct Foo { }; // Type
namespace Foo { } // Non-type, but compiler error instead of hiding
[stmt.label]/1
et un pour les macros [cpp]/8
.