'What is the rule for type deduction for assignment using brace initialization?

In the following code, to my surprise, the { } appears to create a default initialized instance of int rather than of A.

struct A {
  int i = 1;
  A() = default;
  A& operator=(const A& a) {
    this->i = a.i;
    return *this;
  }
  A& operator=(int i) {
    this->i = i;
    return *this;
  }
};

int main() {
  A a;
  a = { };
  return a.i;
}

What rule is used to parse a = { }? I thought that a = { } would have to be equivalent to a = decltype(a){ }.

What is the right term for the type of initialization that takes place here?

Here's an example on godbolt. At -O0 the assembly shows exactly which function is being used. Unless the int assignment operator is removed, A::operator=(int) is called.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source