Разрешение перегрузки квалифицированного имени
Рассмотрим этот вызов функции:
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.