Двухфазное неявное приведение в c ++

0

Разве нет что-то в стандарте c++, в котором я могу косвенно использовать два раза? т.е. в случае, если моя функция принимает объект A, и я вызываю его с объектом CI, не получаю ошибку компиляции, даже если нет прямого перевода между C и A, но есть листинг из C в B и из B в A? В какой-то момент жизни, хотя этот код был законным, но сегодня я узнал, что ошибался.

class A {};

class B {
  A m_a;
public:
  operator A () { return m_a; }
};

class C {
  B m_b;
public:
  operator B () { return m_b; }
};


void f(A a){}

int main()
{
  C c;
  f(c);
  return 0;
}
  • 1
    Кстати, вам не хватает operator A в классе B
  • 0
    В этом коде нет приведений . Есть неявные преобразования . Приведение - это то, что вы пишете в своем исходном коде, чтобы сказать компилятору выполнить преобразование.
Теги:
casting

2 ответа

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

Неявное преобразование может включать только одно пользовательское преобразование. Он также может содержать встроенные преобразования (например, int to long) до и/или после пользовательского преобразования.

Ваш код недействителен, так как для этого потребуется два пользовательских преобразования, от C до B до A (предполагая, что вы хотели сказать operator A не operator int в B). Там есть веская причина: разрешить два преобразования, компилятор должен будет попробовать все возможные промежуточные типы, и существует бесконечное количество возможных типов.

Кстати, здесь нет причастных приемов. Листинг - это явное преобразование типа.

  • 0
    Так может быть двухфазным, если один из них является встроенным преобразованием?
  • 0
    @Mehrdad: Да, пока преобразование однозначно. Если бы C был конвертируемым в int (и никаких других целочисленных типов), а f хотел long , тогда f(C) , преобразующий C в int в long , было бы хорошо.
Показать ещё 4 комментария
1

Поскольку вы хотите преобразовать C в A, оператор преобразования фактически должен быть A, а не B. Вы получаете B, но он не превращается в без кастинга. Однако возвращение B как A будет делать неявное преобразование.

class C {
  B m_b;
public:
  operator A () { return m_b; }
};

Живой пример

  • 0
    Хорошо, я понял, неявное преобразование возвращает объект одного типа, в то время как тип возврата оператора отличается

Ещё вопросы

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