Из cppreference:
С точки зрения поиска неполных имен любого имени после директивы using и до конца области, в которой оно появляется, каждое имя из namespace-name видимо, как если бы оно было объявлено в ближайшем включающем пространстве имен, которое содержит оба директива using и имя пространства имен.
«Самая внутренняя» область, содержащая имя-пространства-имен, — это область, в которой объявлено имя-пространства-имен, и она должна включать область, содержащую директиву-использования, чтобы директива-использования была допустимой.
Это означает, что «ближайшее охватывающее пространство имен, содержащее как директиву using, так и имя пространства имен», — это просто пространство имен, в котором было объявлено имя пространства имен. В таком случае, зачем так многословно формулировать это?
Я что-то неправильно понимаю? Есть ли здесь какие-то тонкости, которые я упускаю?
Одно и то же (охватывающее) пространство имен можно открывать и закрывать более одного раза в одной и той же единице перевода. Здесь конкретно указано, к какому из них относится использование.
В этом случае @RichardCritten using
применяется ко всему объединенному пространству имен, не так ли?
В вашем заголовке говорится об использовании объявлений, а в вашем вопросе — об использовании директив. Это две разные языковые конструкции, которые совершенно по-разному влияют на поиск имени. Директива using имеет форму using namespace X;
. Декларация использования имеет форму using X::Y;
. (Чтобы еще больше запутать, директивы использования и объявления использования являются объявлениями.)
@user17732522 user17732522 Исправлено, моя вина. Я правильно понял тег, но перепутал заголовок.
это просто пространство имен, в котором было объявлено имя_пространства_имен. В таком случае, зачем так многословно формулировать это?
Это не всегда так. Чтобы прояснить ситуацию, рассмотрим следующий надуманный пример. Здесь ближайшее охватывающее пространство имен, содержащее как директиву using, так и имя пространства имен, является глобальным пространством имен. Это означает, что int k = i;
неоднозначно, поскольку можно использовать два i
.
Если, с другой стороны, если бы мы следовали вашему измененному правилу (только пространство имен, в котором было объявлено имя-пространства-имен), тогда соответствующим пространством имен было бы только outer
, которое содержит только имя-пространства-имен.
int i = 12;
namespace outer
{
namespace n1
{
int i = 10;
}
}
namespace n2
{
void f()
{
using namespace outer::n1;
int k = i; //this is ambiguous because i already exists in global namespace
}
}
Ах, я ошибался, полагая, что область, в которой объявлено имя пространства имен, должна иметь директиву using.
@RajdeepSindhu Да, именно.
«в котором имя-пространства имен было определено», я полагаю, вы имеете в виду «объявлено», а не «определено»