This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 120a. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.

2026-05-31


990. Value initialization with multiple initializer-list constructors

Section: 9.5.5  [dcl.init.list]     Status: CD2     Submitter: Daniel Krügler     Date: 20 October, 2009

[Voted into WP at March, 2010 meeting as part of document N3079.]

It should always be possible to use the new brace syntax to value-initialize an object. However, the current rules make the following example ill-formed because of ambiguity:

    struct S {
      S();
      S(std::initializer_list<int>);
      S(std::initializer_list<double>);
    };
    S s{};    // Ambiguous initializer-list constructor reference,
              // not value initialization.

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:

  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]