Рассмотрим этот вызов функции:
foo::bar();
11.3.1.1.1, пункт 3 [over.call.func] (N4778) охватывает этот случай:
В неквалифицированных вызовах функций имя не определяется
->
или же.
оператор и имеет более общую форму первичное выражение. Имя ищется в контексте вызова функции следуя обычным правилам поиска имен в вызовах функций …
Вот, foo::bar
это неквалифицированное имя, в том смысле, что он не квалифицирован ->
или же .
. Таким образом, этот пункт применяется. Теперь значение фразы «посмотрел в контексте» объясняется в пункте 6.4 пункта [basic.lookup]:
Имя «смотрел вверх в контексте выражения» ищется как неквалифицированное имя в области, где выражение найдено.
Тем не мение, foo::bar
это квалифицированное имя в сфере поиска имени. Другими словами, эта комбинация параграфов в основном говорит, что квалифицированное имя foo::bar
ищется по правилу безусловного поиска имени. Однако я не думаю, что поиск безусловного имени способен рекурсивно войти в более узкую область, то есть foo
в bar
, Это дефект?
Нет, я не думаю, что это дефект. Это говорит
Имя ищется в контексте вызова функции следуя обычным правилам поиска имен в вызовах функций […]
Как видно из части, которую я выделил, стандарт определяет способ поиска имени: По имени.
Поиск имени включает в себя неквалифицированный, квалифицированный и зависимый от аргумента поиск, поэтому ваше имя действительно разрешается правилами поиска по квалифицированным именам.
«Посмотрел вверх в контексте выраж«Правило здесь не применяется, так как указано, какое правило используется. Этот параграф вступает в игру только тогда, когда его нет. Например, в [Class.qual] p1:
имена в Шаблон-аргумент из Шаблон-идентификатор ищутся в контексте, в котором весь постфикс-выражение происходит.
Других решений пока нет …