Неполный поиск имени после использования директив в C++

Из cppreference:

С точки зрения поиска неполных имен любого имени после директивы using и до конца области, в которой оно появляется, каждое имя из namespace-name видимо, как если бы оно было объявлено в ближайшем включающем пространстве имен, которое содержит оба директива using и имя пространства имен.

«Самая внутренняя» область, содержащая имя-пространства-имен, — это область, в которой объявлено имя-пространства-имен, и она должна включать область, содержащую директиву-использования, чтобы директива-использования была допустимой.

Это означает, что «ближайшее охватывающее пространство имен, содержащее как директиву using, так и имя пространства имен», — это просто пространство имен, в котором было объявлено имя пространства имен. В таком случае, зачем так многословно формулировать это?

Я что-то неправильно понимаю? Есть ли здесь какие-то тонкости, которые я упускаю?

«в котором имя-пространства имен было определено», я полагаю, вы имеете в виду «объявлено», а не «определено»

463035818_is_not_an_ai 29.06.2024 12:34

Одно и то же (охватывающее) пространство имен можно открывать и закрывать более одного раза в одной и той же единице перевода. Здесь конкретно указано, к какому из них относится использование.

Richard Critten 29.06.2024 12:41

В этом случае @RichardCritten using применяется ко всему объединенному пространству имен, не так ли?

Rajdeep Sindhu 29.06.2024 12:51

В вашем заголовке говорится об использовании объявлений, а в вашем вопросе — об использовании директив. Это две разные языковые конструкции, которые совершенно по-разному влияют на поиск имени. Директива using имеет форму using namespace X;. Декларация использования имеет форму using X::Y;. (Чтобы еще больше запутать, директивы использования и объявления использования являются объявлениями.)

user17732522 29.06.2024 18:02

@user17732522 user17732522 Исправлено, моя вина. Я правильно понял тег, но перепутал заголовок.

Rajdeep Sindhu 29.06.2024 18:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

это просто пространство имен, в котором было объявлено имя_пространства_имен. В таком случае, зачем так многословно формулировать это?

Это не всегда так. Чтобы прояснить ситуацию, рассмотрим следующий надуманный пример. Здесь ближайшее охватывающее пространство имен, содержащее как директиву 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.

Rajdeep Sindhu 29.06.2024 13:12

@RajdeepSindhu Да, именно.

user12002570 29.06.2024 13:14

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