Я ищу цитату из Stadard, которая описала следующее поведение:
Следующее правило относится к conversion-type-id
(3.4.6/7):
Если id-выражение является идентификатором функции-преобразования, его идентификатор типа преобразования сначала просматривается в классе выражения объекта, и используется имя, если оно найдено. В противном случае он просматривается в контексте всего постфиксного выражения.
Рассмотрим следующий пример:
#include <iostream>
class J{ public: static const char a = 'j'; };
typedef J Y;
class C
{
public:
operator Y(){ std::cout << Y::a; }
};
int main()
{
typedef Y Z;
C *c= new C();
c -> operator Z(); //C::operator Y is invoked
}
Я этого не понимаю. В приведенной выше цитате не описывается это поведение. Он описывает поиск только для conversion-type-id
, но он не описывает сам conversion-function-id
.
Каково правило поиска для conversion-function-id
?
Если явно используется идентификатор функции преобразования, как в примере выражения c->operator Z()
, правила поиска те же, что и для любого другого члена класса. Один трюк - это определение из пункта 3 раздела 3:
Два имени одинаковы, если
они являются идентификаторами, состоящими из одной и той же последовательности символов, или
они являются идентификаторами оператор-функций, образованными с одним и тем же оператором, или
они являются идентификаторами-преобразованиями, образованными одним и тем же типом, или
они являются идентификаторами шаблонов, которые относятся к одному и тому же классу или функции, или
они являются именами буквальных операторов, образованных с одним и тем же литеральным идентификатором суффикса.
Третий вариант: почему operator Z
используемый в выражении, находит член класса C::operator Y()
. Он входит в класс доступа с тем же именем, что и выражение-функция-идентификатор выражения.