Примечание: этот вопрос о name space
, а не namespace
.
Стандарт C ++ имеет некоторые ссылки name space
, но я не вижу определения этого. Стандарты гласят, что метки и макросы находятся в разных пространствах имен. Все остальные ссылки name space
находятся в разделе совместимости с C / C ++, например так ( текущий проект ):
Это одна из немногих несовместимостей между C и C ++, которую можно отнести к новому определению пространства имен C ++, где имя может быть объявлено как тип и как нетип в одной области видимости, что приводит к тому, что нетипичное имя скрывает имя типа и требование, чтобы ключевые слова class, struct, union или enum использовались для ссылки на имя типа. Это новое определение пространства имен обеспечивает важные нотационные удобства для программистов на C ++ и помогает максимально приблизить использование пользовательских типов к использованию фундаментальных типов.
Что это за новое определение пространства имен ? Где я могу найти это в стандарте? Каковы точные правила? Правила кажутся более сложными, чем «скрытые типы нетипизированных типов». Мол, это не компилируется:
typedef int Foo; // Foo is a type
void Foo(); // not a type, but compile error, instead of hiding
Но это делает:
struct Foo { }; // Foo is a type as well
void Foo(); // This hides the type Foo. "struct Foo" refers to the type
И это тоже не компилируется:
struct Foo { }; // Type
namespace Foo { } // Non-type, but compiler error instead of hiding
[stmt.label]/1
и одно для макросов [cpp]/8
.