Но поиск второй фазы вызывает только ADL, который не учитывает функции-члены, не так ли?
Это не так. Однако ADL добавляет к поисковому набору, он не включает в себя все это. Кроме того, идея, которую вы здесь перефразируете, применима к постфиксному выражению в postfix-expression(args)
, когда указанное постфиксное выражение представляет собой безусловный идентификатор .
[temp.dep]
1 ... В выражении вида:
postfix-expression ( expression-list<sub>opt</sub> )
, где постфиксным выражением является безусловный идентификатор,unqualified-id обозначает зависимое имя, если
Если операнд оператора является зависимым от типа выражением,Оператор также обозначает зависимое имя. Такие имена не связаны и ищутся в точке создания шаблона ([temp.point]) как в контексте определения шаблона, так и в контексте точки создания.
Так что есливместо этого у вас было foo()
, при поиске не учитывались бы члены, а вместо этого использовались бы только свободные функции, как в точке определения, так и в экземпляре (где ADL можно добавить в набор поиска, предполагая, что у нас было зависимое выражение).
Но для this->foo
(я намеренно пропустил вызов, чтобы обсудить выражение postfix), у нас есть доступ к членам класса. И здесь применяются другие параграфы:
[temp.dep.type]
5 Имя является членом текущего экземпляраесли это
- [...]
- id-выражение, обозначающее член в выражении доступа к члену класса, для которого тип выражения объекта является текущей реализацией, ивыражение id при поиске относится, по крайней мере, к одному члену класса, который является текущим экземпляром, или его независимому базовому классу. [Примечание: если такой член не найден, а текущая реализация имеет какие-либо зависимые базовые классы, тогда id-выражение является членом неизвестной специализации;Смотри ниже. - примечание к концу]
6 Имя является членом неизвестной специализации, если оно
- [...]
- Идентификационное выражение, обозначающее член в выражении доступа к члену класса, в котором либо
- тип выражения объекта является текущим экземпляром, текущий экземпляр имеет по крайней мере один зависимый базовый класс, и поиск имениid-выражение не находит члена класса, который является текущим экземпляром, или его независимого базового класса;или
7 Аналогично, если id-выражение в выражении доступа к члену класса, для которого тип выражения объекта является текущим, нессылаясь на члена текущего экземпляра или члена неизвестной специализации, программа некорректна, даже если шаблон, содержащий выражение доступа члена, не создан;Диагностика не требуется.
Эти маркеры говорят нам, какой поиск нужно выполнить при обнаружении this->foo
. Он смотрит только на членов. В нашем случае у нас есть независимый базовый класс в текущем экземпляре, так что именно здесь должен быть найден член, однозначно.
Найдя функцию-член, постфиксное выражение this->foo
обозначает вызываемый объект, и именно так разрешается вызов функции.