Date
2010-02-15.00:00:00
Message id
2545

Content

Proposed resolution (February, 2010):

Change 9.5.5 [dcl.init.list] paragraph 3 as follows:

List-initialization of an object or reference of type T is defined as follows:

  • If the initializer list has no elements and T is a class type with a default constructor, the object is value-initialized.

  • Otherwise, if the initializer list has no elements and T is an aggregate, the initializer list is used to initialize each of the members of T. [Example:

  •   struct A {
        A(std::initializer_list<int>);  // #1
      };
      struct B {
        A a;
      };
      B b { };    // OK, uses #1
      B b { 1 };  // error
    

    end example]

  • If Otherwise, if T is an aggregate...

  • ...

  • [Example:

      struct S {
        S(std::initializer_list<double>);  // #1
        S(std::initializer_list<int>);     // #2
        S();                                     // #3
        // ...
      };
      S s1 = { 1.0, 2.0, 3.0 };            // invoke #1
      S s2 = { 1, 2, 3 };                  // invoke #2
      S s3 = { };                          // invoke #3 (for value-initialization; see above)
    

    end example]