<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<TITLE>
    CWG Issue 2376</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="2376"></A><H4>2376.
  
Class template argument deduction with array declarator
</H4>
<B>Section: </B>12.2.2.9&#160; [<A href="https://wg21.link/over.match.class.deduct">over.match.class.deduct</A>]
 &#160;&#160;&#160;

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

 <B>Submitter: </B>Mike Miller
 &#160;&#160;&#160;

 <B>Date: </B>2018-03-01<BR>


<P>[Accepted as a DR at the July, 2019 meeting.]</P>

<P>An example like</P>

<PRE>
   template &lt;class ...T&gt; struct A {
     A(T...) {}
   };
   A x[29]{};

</PRE>

<P>Appears to be permitted by the current wording of the Standard,
but existing implementations reject it. Should this usage be
supported (in which case some mention of it in the wording would
be useful) or prohibited?</P>

<P><B>Notes from the November, 2018 meeting:</B></P>

<P>The example is intended to be ill-formed; the intent is
that declarator operators are not permitted, as
with <TT>decltype(auto).</TT>
</P>

<P><B>Proposed resolution, March, 2019:</B></P>

<P>Change 9.2.9.8 [<A href="https://wg21.link/dcl.type.class.deduct#1">dcl.type.class.deduct</A>] paragraph 1 as follows:</P>

<BLOCKQUOTE>

<P>If a placeholder for a deduced class type appears as
a <I>decl-specifier</I> in the <I>decl-specifier-seq</I> of
an initializing declaration (9.5 [<A href="https://wg21.link/dcl.init">dcl.init</A>]) of a
variable, the <INS>declared type of the variable shall be
<I>cv</I> <TT>T</TT>, where <TT>T</TT> is the placeholder.
[<I>Example:</I></INS>
</P>

<PRE>
<INS>  template &lt;class ...T&gt; struct A {
    A(T...) {}
  };
  A x[29]{};    //<SPAN CLASS="cmnt"> error: no declarator operators allowed</SPAN>
  const A&amp; y{}; //<SPAN CLASS="cmnt"> error: no declarator operators allowed</SPAN></INS>
</PRE>

<P>
<INS>&#8212;<I>end example</I>] The</INS>
placeholder is replaced by the return type of
the function selected by overload resolution for class
template deduction (12.2.2.9 [<A href="https://wg21.link/over.match.class.deduct">over.match.class.deduct</A>]). If
the <I>decl-specifier-seq</I> is followed by
an <I>init-declarator-list</I>
or <I>member-declarator-list</I> containing more than one
declarator, the type that replaces the placeholder shall be
the same in each deduction.</P>

</BLOCKQUOTE>

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