Разве нет что-то в стандарте 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;
}
Неявное преобразование может включать только одно пользовательское преобразование. Он также может содержать встроенные преобразования (например, int
to long
) до и/или после пользовательского преобразования.
Ваш код недействителен, так как для этого потребуется два пользовательских преобразования, от C
до B
до A
(предполагая, что вы хотели сказать operator A
не operator int
в B
). Там есть веская причина: разрешить два преобразования, компилятор должен будет попробовать все возможные промежуточные типы, и существует бесконечное количество возможных типов.
Кстати, здесь нет причастных приемов. Листинг - это явное преобразование типа.
C
был конвертируемым в int
(и никаких других целочисленных типов), а f
хотел long
, тогда f(C)
, преобразующий C
в int
в long
, было бы хорошо.
Поскольку вы хотите преобразовать C
в A
, оператор преобразования фактически должен быть A, а не B. Вы получаете B, но он не превращается в без кастинга. Однако возвращение B как A будет делать неявное преобразование.
class C {
B m_b;
public:
operator A () { return m_b; }
};
operator A
в классеB