Область применения `пространства имен` в другом пространстве имен

Я знаю, что область применения директивы using ограничена блоком или функцией, если ее поместить внутрь. Тогда это будет применяться только к этой области. Но если блок namespace это очевидно применяется через все блоки одного и того же пространства имен. Это верно? По крайней мере, следующий пример предполагает, что: ( http://ideone.com/K8dk7E)

namespace N1
{
    struct Foo{};
}

namespace N2
{
    using namespace N1;
    Foo f;
}

namespace N2
{
    Foo f2;
}

int main()
{
    N2::f2;
}

Я ожидал Foo f2 дать ошибку, так как Foo должно быть неизвестно. Так что мой реальный вопрос, является ли using оператор в пределах блока пространства имен, действующий для всех блоков одного и того же пространства имен?

Это вызывает проблемы, когда все файлы cpp включены и скомпилированы вместе, так как это загрязняет другие файлы cpp, которые не должны включать другое пространство имен (то, для которого установлена ​​директива using). Таким образом, в действительности это может вызвать нежелательные конфликты.

3 ответа

Решение

Стандарт гласит, что (7.3.4/2)

Директива using указывает, что имена в номинированном пространстве имен могут использоваться в области, в которой директива using появляется после директивы using.

namespace A {  \
int i = 9;      | <-- namespace A scope. 
}              /

namespace B {      \
using namespace A;  | <-- namespace B scope. "i" is visible after 
void bar()          |     the "using namespace" line.
{                   |
    i += 1; /*Ok*/  |     
}                   |
}                  /

namespace B {     \
void foo()         |
{                  | <-- still namespace B scope. "i" is still visible
    i += 1; /*Ok*/ |
}                  |
}                 /

Таким образом, материал, видимый с помощью директивы using, будет виден везде в области видимости после using namespace B линия. Конечно, если вы сделаете это в заголовочном файле, все это будет видно везде, где вы включаете этот заголовочный файл, так что вам не следует использовать слово "используя пространство имен..." где-либо в заголовках.

Это using оператор в пределах блока пространства имен, действующий для всех блоков одного и того же пространства имен?

Когда директива using видна в модуле перевода (включена), да.

В результате загрязнения окружающего пространства имен вы, например, не помещаете эти операторы в заголовочные файлы или вообще избегаете их / в области пространства имен.

Для справки:

Я думаю, что в соответствии с теорией пространства имен ваш вопрос является правильным, потому что этот механизм используется для помещения имен, определенных библиотекой, в одно место, и это помогает избежать непреднамеренных конфликтов имен.

Другие вопросы по тегам