Мне трудно понять взаимные преобразования, это объясняется в C ++ Primer 5 ed.:
«В следующем примере мы определили два способа получения A из B : либо с помощью оператора преобразования B, либо с помощью конструктора A, который принимает B: // обычно плохая идея для взаимных преобразований между двумя типами классов:
struct B;
struct A {
A() = default;
A(const B&); // converts a B to an A
// other members
};
struct B {
operator A() const; // also converts a B to an A
// other members
};
A f(const A&);
B b;
A a = f(b); // error ambiguous: f(B::operator A())
// or f(A::A(const B&))
Потому что есть два пути чтобы получить A из B, компилятор не знает, какое преобразование выполнить; вызов f неоднозначен. Этот вызов может использовать конструктор A, который принимает B, или он может использовать оператор преобразования B, который преобразует B на A. Поскольку эти две функции одинаково хороши, вызов является ошибочным.
Если мы хотим сделать этот вызов, мы должны явно вызвать оператор преобразования или конструктор:
A a1 = f(b.operator A()); // ok: use B's conversion operator
A a2 = f(A(b)); // ok: use A's constructor
Обратите внимание, что мы не можем разрешить неоднозначность, используя приведение - само приведение будет иметь такую же неоднозначность ».
- Но когда я определил требуемые члены и * 1 016 * Я не получаю ошибок! его объяснение выглядит настолько логичным, но я не знаю, почему код работает нормально?!