The output of the code below in VS2015 is "constructor".
Shouldn't it fail to compile due to the missing assignment operator?
struct A { }; struct B { B(){} B(const A& a) { cout << "constructor" << endl; } //B& operator=(const A& a) { // cout << "assignment operator" << endl; // return *this; //} }; int main() { A a; B b; b = a; return 0; }
Yes, when there is a conversion going on, like in your testcase.
You're effectively calling
b = B(a);
Because B
's assignment operator B& operator=(B const&)
is implicitly declared, it is found during overload resolution. Because your assignment is only one conversion away from being a match (and that's exactly the number of conversions that are allowed to happen), it converts a
to B
and then assigns the new temporary B
to b
.
Let's consider an analogous example.
double a; int b=5; a=b;
The only thing you can assign to a double
is another double
. However, an int
can be converted to a double
.
Similarly here, A
can be converted to B
, because the constructor to do so exists. And that's what happens.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With