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