bitwise bitwise - 28 days ago 10
C++ Question

Should a constructor ever be called on assignment?

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;
}

Answer

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 exectly the number of conversions that are allowed to happen), it converts a to B and then assigns the new temporary B to b.

Comments