<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<TITLE>
    CWG Issue 865</TITLE>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<STYLE TYPE="text/css">
  INS { text-decoration:none; font-weight:bold; background-color:#A0FFA0 }
  .INS { text-decoration:none; background-color:#D0FFD0 }
  DEL { text-decoration:line-through; background-color:#FFA0A0 }
  .DEL { text-decoration:line-through; background-color: #FFD0D0 }
  @media (prefers-color-scheme: dark) {
    HTML { background-color:#202020; color:#f0f0f0; }
    A { color:#5bc0ff; }
    A:visited { color:#c6a8ff; }
    A:hover, a:focus { color:#afd7ff; }
    INS { background-color:#033a16; color:#aff5b4; }
    .INS { background-color: #033a16; }
    DEL { background-color:#67060c; color:#ffdcd7; }
    .DEL { background-color:#67060c; }
  }
  SPAN.cmnt { font-family:Times; font-style:italic }
</STYLE>
</HEAD>
<BODY>
<P><EM>This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21
  Core Issues List revision 118b.
  See http://www.open-std.org/jtc1/sc22/wg21/ for the official
  list.</EM></P>
<P>2025-09-28</P>
<HR>
<A NAME="865"></A><H4>865.
  
Initializing a <TT>std::initializer_list</TT>
</H4>
<B>Section: </B>9.5.5&#160; [<A href="https://wg21.link/dcl.init.list">dcl.init.list</A>]
 &#160;&#160;&#160;

 <B>Status: </B>CD2
 &#160;&#160;&#160;

 <B>Submitter: </B>James Widman
 &#160;&#160;&#160;

 <B>Date: </B>8 April, 2009<BR>


<P>[Voted into WP at October, 2009 meeting.]</P>

<P>There are several problems with the wording of 9.5.5 [<A href="https://wg21.link/dcl.init.list#4">dcl.init.list</A>] paragraph 4:
</P>

<BLOCKQUOTE>

When an initializer list is implicitly converted to a
<TT>std::initializer_list&lt;E&gt;</TT>, the object passed is
constructed as if the implementation allocated an array of <I>N</I>
elements of type <TT>E</TT>, where <I>N</I> is the number of elements
in the initializer list. Each element of that array is initialized
with the corresponding element of the initializer list converted to
<TT>E</TT>, and the <TT>std::initializer_list&lt;E&gt;</TT> object is
constructed to refer to that array.  If a narrowing conversion is
required to convert the element to <TT>E</TT>, the program is
ill-formed.

</BLOCKQUOTE>

<P>First, an initializer list is not an expression, so it is not
appropriate to refer to &#8220;implicitly convert[ing]&#8221; it,
as is done in the first sentence.</P>

<P>Also, the conversion of the elements of the initializer list to the
elements of the array is not specified to be either
copy-initialization or direct-initialization.  If this is intended to
be viewed as an aggregate initialization, it would be
copy-initialization, but that needs to be specified more clearly.</P>

<P>Finally, the initializer list can have nested initializer lists, so
the references to converting the element also need to be cleaned
up.</P>

<P><B>Proposed resolution (July, 2009):</B></P>

<P>Change 9.5.5 [<A href="https://wg21.link/dcl.init.list#4">dcl.init.list</A>] paragraph 4 as follows:</P>

<BLOCKQUOTE>

<DEL>When an initializer list is implicitly converted to a</DEL>
<INS>An object of type</INS> <TT>std::initializer_list&lt;E&gt;</TT>
<INS>is constructed from an initializer list</INS><DEL>, the object
passed is constructed</DEL> as if the implementation allocated an
array of <I>N</I> elements of type <TT>E</TT>, where <I>N</I> is the
number of elements in the initializer list. Each element of that array
is <INS>copy-</INS>initialized with the corresponding element of the
initializer list<DEL> converted to <TT>E</TT></DEL>, and the
<TT>std::initializer_list&lt;E&gt;</TT> object is constructed to refer
to that array.  If a narrowing conversion is required to <DEL>convert
the element to <TT>E</TT></DEL> <INS>initialize any of the
elements</INS>, the program is ill-formed. [<I>Example:</I>...

</BLOCKQUOTE>

<BR><BR>
</BODY>
</HTML>
