Я ищу цитату из Stadard описал следующее поведение:
Следующее правило для conversion-type-id
поиск (3.4.6 / 7):
Если id-выражение является id-функции преобразования, его
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()
правила поиска такие же, как и для любого другого члена класса. Одна хитрость есть определение из параграфа 8 параграфа 3:
Два имени тот же самый если
они есть идентификаторы состоит из той же последовательности символов, или
они есть Оператор-функция-идентификаторы формируется с тем же оператором, или
они есть преобразование-функциональные идентификаторы формируется с тем же типом, или
они есть Шаблон Идентификаторы которые ссылаются на тот же класс или функцию, или
это имена литеральных операторов, сформированных с одним и тем же буквенным идентификатором суффикса.
Третий вариант здесь, почему имя operator Z
используется в выражении находит члена класса C::operator Y()
, Это член в доступном классе с тем же именем, что и выражение преобразование-функция-идентификатор.