<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<TITLE>
    CWG Issue 1866</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="1866"></A><H4>1866.
  
Initializing variant members with non-trivial destructors
</H4>
<B>Section: </B>14.3&#160; [<A href="https://wg21.link/except.ctor">except.ctor</A>]
 &#160;&#160;&#160;

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

 <B>Submitter: </B>Vinny Romano
 &#160;&#160;&#160;

 <B>Date: </B>2014-02-12<BR>


<P>[Moved to DR at the November, 2014 meeting.]</P>



<P>According to 14.3 [<A href="https://wg21.link/except.ctor#2">except.ctor</A>] paragraph 2,</P>

<BLOCKQUOTE>

An object of any storage duration whose initialization or destruction is
terminated by an exception will have destructors executed for all of its
fully constructed subobjects (excluding the variant members of a union-like
class), that is, for subobjects for which the principal constructor
(11.9.3 [<A href="https://wg21.link/class.base.init">class.base.init</A>]) has completed execution and the destructor
has not yet begun execution.

</BLOCKQUOTE>

<P>This introduces a potential leak if a variant member is initialized and
has a non-trivial destructor.  If the assumption can't be made that such an
initialized member is the active member at the time an exception occurs so
that it can be destroyed, perhaps variant members of types having a
non-trivial destructor should be prohibited.</P>

<P><B>Notes from the June, 2014 meeting:</B></P>

<P>CWG favored removing the exclusion of variant members from the
destruction following an exception during construction, though not
during destruction.  If the active member of the union has changed
between the initialization and destruction, the behavior is undefined.</P>

<P><B>Proposed Resolution (July, 2014):</B></P>

<P>Change 14.3 [<A href="https://wg21.link/except.ctor#2">except.ctor</A>] paragraph 2 as follows:</P>

<BLOCKQUOTE>

An object of any storage duration whose initialization or
destruction is terminated by an exception will have
destructors executed for all of its fully constructed
subobjects <DEL>(excluding the variant members of a
union-like class)</DEL>, that is, for subobjects for which
the principal constructor (11.9.3 [<A href="https://wg21.link/class.base.init">class.base.init</A>]) has
completed execution and the destructor has not yet begun
execution<INS>, except that in the case of destruction, the
variant members of a union-like class are not
destroyed</INS>. Similarly, if the non-delegating
constructor...

</BLOCKQUOTE>

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