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