C ++ оператор, перегружающий синтетическое преобразование - PullRequest
0 голосов
/ 03 января 2011

Этот пример из "Мышление в C ++", у меня есть один вопрос, касающийся компилятора, синтезирующего функцию преобразования оператора.

Вопрос
Когда передается объект класса Four (ввызов функции f ()), вызывается операция перегрузки ().Но я не могу разобрать используемую логику (компилятор синтезирует вызов операции) компилятором для достижения этого преобразования.

На максимуме я могу ожидать явного поведения преобразования, например
1. obj3 = (Три) obj4;
2. obj3 = Три (obj4);
3. obj3 = static_cast <Three> (obj4);

Теперь для любого из приведенных выше преобразований - каксинтезатор компилятора,
(Три) obj4.operator ()?

Может быть, я упускаю какой-то важный момент.

Пример

//: C12:Opconv.cpp
// Op overloading conversion

class Three {
  int i;
public:
  Three(int ii = 0, int = 0) : i(ii) {}
};

class Four {
  int x;
public:
  Four(int xx) : x(xx) {}
  operator Three() const { return Three(x); }
};

void g(Three) {}

int main() {
  Four four(1);
  g(four);
  g(1);  // Calls Three(1,0)
} ///:~

Ответы [ 2 ]

1 голос
/ 03 января 2011

Прежде всего, вы не указали operator(), а operator Three.Этот оператор сообщает компилятору, как преобразовать объект class Four в объект class Threeg(four) компилятор вызовов использует этот оператор, поскольку функция g ожидает аргумент типа Three.Поскольку есть доступное преобразование, его использует компилятор.Во втором случае, поскольку конструктор Three не объявлен как explicit, и возможно создать объект class Three, используя одно целое (используя конструктор Three), компилятор использует этот конструктор для созданияобъект class Three, чтобы можно было вызывать функцию g.

0 голосов
/ 03 января 2011

Прежде всего, class Four не содержит operator(), но имеет operator Three(), который является оператором преобразования.

В строке

g(four);

компилятору необходимо преобразовать four в объект class Three и синтезировать вызов operator Three() для выполнения этого преобразования. Синтезированное преобразование эквивалентно

g(four.operator Three());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...