Сообщение об ошибке означает, что эти два оператора
operator A(void) const { return A(_m); }
operator int(void) const { return _m; }
могут использоваться в выражении
(A)b;
. В результате, используя эти операторы преобразования, можно использовать любой конструктор A( int )
или конструктор копирования по умолчанию A( const A & )
.
Чтобы сделать его более понятным, переписать соответствующее объявление, например
A a = A( b );
Так будет ли объект b преобразован в объект типа Aиспользуя первый оператор преобразования или объект типа int, используя второй оператор преобразования.
Вы можете избежать неоднозначности, объявляя операторы, например, такие как
operator A(void) const & { return A(_m); }
operator int(void) const && { return _m; }
, что для lvaluesбудет использоваться первый оператор, а для значений r будет использоваться второй оператор.
Вот ваша программа с измененными операторами.
#include <iostream>
class A
{
public:
A(void) :_m(0) { }
A(int val) : _m(val) {}
private:
int _m;
};
class B
{
public:
B(void) : _m(0) {}
B(int val) : _m(val) {}
B(const A&);
// there is a direct conversion operator here
operator A(void) const & { return A(_m); }
operator int(void) const && { return _m; }
private:
int _m;
};
int main()
{
B b;
A a = b;
A a1 = B();
}