Разрешение перегрузки квалифицированного имени

Рассмотрим этот вызов функции:

foo::bar();

11.3.1.1.1, пункт 3 [over.call.func] ( N4778) охватывает этот случай:

В неквалифицированных вызовах функций имя не определяется -> или же . оператор и имеет более общую форму первичного выражения. Имя ищется в контексте вызова функции, следуя обычным правилам поиска имени в вызовах функций...

Вот, foo::bar это неквалифицированное имя, в том смысле, что оно не -> или же ., Таким образом, этот пункт применяется. Теперь значение фразы "посмотрел в контексте" объясняется в пункте 6.4 пункта [basic.lookup]:

Имя "ищется в контексте выражения" ищется как неквалифицированное имя в области, в которой найдено выражение.

Тем не мение, foo::bar является квалифицированным именем в области поиска имени. Другими словами, эта комбинация параграфов в основном говорит, что квалифицированное имя foo::bar ищется по правилу безусловного поиска имени. Однако я не думаю, что поиск безусловного имени способен рекурсивно войти в более узкую область, то есть foo в bar, Это дефект?

1 ответ

Решение

Нет, я не думаю, что это дефект. Это говорит

Имя ищется в контексте вызова функции, следуя обычным правилам поиска имени в вызовах функций [...]

Как видно из части, которую я выделил, стандарт определяет способ поиска имени: По имени.

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

Правило "посмотрел в контексте выражения" здесь не применимо, так как указано, какое правило используется. Этот абзац вступает в игру только тогда, когда это не так. Например, в [class.qual] p1:

имена в аргументе шаблона идентификатора шаблона ищутся в контексте, в котором происходит все выражение postfix.

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