Область применения `пространства имен` в другом пространстве имен
Я знаю, что область применения директивы 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 видна в модуле перевода (включена), да.
В результате загрязнения окружающего пространства имен вы, например, не помещаете эти операторы в заголовочные файлы или вообще избегаете их / в области пространства имен.
Для справки:
Я думаю, что в соответствии с теорией пространства имен ваш вопрос является правильным, потому что этот механизм используется для помещения имен, определенных библиотекой, в одно место, и это помогает избежать непреднамеренных конфликтов имен.