2017-02-02 9 views
0

Согласно (ныне несуществующей) StackOverflow документации по Extending the std namespace и [namespace.constraints]:Использует вложенные пространства имен std и posix undefined?

поведение программы на C++ не определен, если он добавляет декларации или определения для пространства имен std или пространства имен в пространстве имен Std, если не указано иное.

и

Поведение C++ программы не определен, если он добавляет декларации или определения для пространства имен posix или пространства имен в пространстве имен posix, если не указано иное. Пространство имен posix зарезервировано для использования в соответствии с ISO/IEC 9945 и другими стандартами POSIX.

ли эти правила применяются только к глобальныхstd и posix пространств имен, или что-то следующее также определено:

namespace HelloWorld { 
    namespace std { 
     void terminate(); 
    } 
} 

Может быть, это потому, что я родной на английском, но формулировка эти правила, по-видимому, немного расплывчаты в этом аспекте.

+2

Правило применяется только к пространствам имен верхнего уровня. Но используя пространство имен, например, например. 'std' внутри другого пространства имен будет путать для людей, читающих или поддерживающих ваш код (который может включать вас в будущем). Подумайте, что произойдет, если вы используете 'namespace HelloWorld' (с приведенным выше примером). –

+0

На самом деле это не расширение 'std', поскольку оно выполняется в другом пространстве имен. И это также вызовет серьезные проблемы, когда-либо сделайте что-то подобное. Хотя нет правила, запрещающего использование имени 'std' внутри другого пространства имен (которое я знаю), это не то, что вы должны делать, или даже думать о том, чтобы делать. –

+0

Связано также: [В именах имен имен: :: std :: vs std ::] (http://stackoverflow.com/q/18544651/3919155). – jotik

ответ

1

Это действительно несколько неясное правило английского языка. Вы видите, что правила говорят о a пространства имен в пространстве имен std. Почему мы не говорим о «пространстве имен std» или «пространстве имен std»? Это потому, что std является (уникальным) именем этого пространства имен. Сравните «президент», «президент», «президент Трамп».

Так что да, namespace std однозначно относится к этому пространству имен верхнего уровня.