https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92393
Bug ID: 92393 Summary: Uniform initialization of non-copiable class data member cause to error Product: gcc Version: 9.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: i.bubnikov at gmail dot com Target Milestone: --- This is the short example of code that doesn`t compile with GCC9.2 or previous but it must to according to c++ standart. class A { public: A(){}; A(const A &)=delete; ~A(){} }; class B { public: B() : a{} {} A a[1]; }; int main() { B b; } According to c++17 standart: If there are fewer initializer-clauses in the list than there are elements in a non-union aggregate, then each element not explicitly initialized is initialized as follows: *If the element has a default member initializer ([class.mem]), the element is initialized from that initializer. *Otherwise, if the element is not a reference, the element is copy-initialized from an empty initializer list ([dcl.init.list]). *Otherwise, the program is ill-formed. and List-initialization of an object or reference of type T is defined as follows: *[...] *Otherwise, if the initializer list has no elements and T is a class type with a default constructor, the object is value-initialized. *[...] Therefore, the default constructor of A is used directly. There's no copy constructor involved.