Идентификатор функции преобразования члена класса

0

Я ищу цитату из 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?

Теги:
language-lawyer
postfix-operator

1 ответ

1
Лучший ответ

Если явно используется идентификатор функции преобразования, как в примере выражения c->operator Z(), правила поиска те же, что и для любого другого члена класса. Один трюк - это определение из пункта 3 раздела 3:

Два имени одинаковы, если

  • они являются идентификаторами, состоящими из одной и той же последовательности символов, или

  • они являются идентификаторами оператор-функций, образованными с одним и тем же оператором, или

  • они являются идентификаторами-преобразованиями, образованными одним и тем же типом, или

  • они являются идентификаторами шаблонов, которые относятся к одному и тому же классу или функции, или

  • они являются именами буквальных операторов, образованных с одним и тем же литеральным идентификатором суффикса.

Третий вариант: почему operator Z используемый в выражении, находит член класса C::operator Y(). Он входит в класс доступа с тем же именем, что и выражение-функция-идентификатор выражения.

  • 0
    Отлично! Большое спасибо, вы развеете мои сомнения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню