<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 2789: Equivalence of contained objects</title>
<meta property="og:title" content="Issue 2789: Equivalence of contained objects">
<meta property="og:description" content="C++ library issue. Status: C++17">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue2789.html">
<meta property="og:type" content="website">
<meta property="og:image" content="http://cplusplus.github.io/LWG/images/cpp_logo.png">
<meta property="og:image:alt" content="C++ logo">
<style>
  p {text-align:justify}
  li {text-align:justify}
  pre code.backtick::before { content: "`" }
  pre code.backtick::after { content: "`" }
  blockquote.note
  {
    background-color:#E0E0E0;
    padding-left: 15px;
    padding-right: 15px;
    padding-top: 1px;
    padding-bottom: 1px;
  }
  ins {background-color:#A0FFA0}
  del {background-color:#FFA0A0}
  table.issues-index { border: 1px solid; border-collapse: collapse; }
  table.issues-index th { text-align: center; padding: 4px; border: 1px solid; }
  table.issues-index td { padding: 4px; border: 1px solid; }
  table.issues-index td:nth-child(1) { text-align: right; }
  table.issues-index td:nth-child(2) { text-align: left; }
  table.issues-index td:nth-child(3) { text-align: left; }
  table.issues-index td:nth-child(4) { text-align: left; }
  table.issues-index td:nth-child(5) { text-align: center; }
  table.issues-index td:nth-child(6) { text-align: center; }
  table.issues-index td:nth-child(7) { text-align: left; }
  table.issues-index td:nth-child(5) span.no-pr { color: red; }
  @media (prefers-color-scheme: dark) {
     html {
        color: #ddd;
        background-color: black;
     }
     ins {
        background-color: #225522
     }
     del {
        background-color: #662222
     }
     a {
        color: #6af
     }
     a:visited {
        color: #6af
     }
     blockquote.note
     {
        background-color: rgba(255, 255, 255, .10)
     }
  }
</style>
</head>
<body>
<hr>
<p><em>This page is a snapshot from the LWG issues list, see the <a href="lwg-active.html">Library Active Issues List</a> for more information and the meaning of <a href="lwg-active.html#C++17">C++17</a> status.</em></p>
<h3 id="2789"><a href="lwg-defects.html#2789">2789</a>. Equivalence of contained objects</h3>
<p><b>Section:</b> 22.7.4 <a href="https://wg21.link/any.class">[any.class]</a> <b>Status:</b> <a href="lwg-active.html#C++17">C++17</a>
 <b>Submitter:</b> Jonathan Wakely <b>Opened:</b> 2016-11-09 <b>Last modified:</b> 2017-07-30</p>
<p><b>Priority: </b>0
</p>
<p><b>View all other</b> <a href="lwg-index.html#any.class">issues</a> in [any.class].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#C++17">C++17</a> status.</p>
<p><b>Discussion:</b></p>
<p>
<b>Addresses US 29</b>
<p/>
What does it mean for (the contained) objects to be "equivalent"?
<p/>
Suggested resolution:
<p/>
Add definition (note that using <code>operator==()</code> involves complicated questions of overload 
resolution).
</p>

<p><i>[2016-11-08, Jonathan comments and suggests wording]</i></p>

<p>
We can rephrase the copy constructor in terms of equivalence to
construction from the contained object. We need to use in-place
construction to avoid recursion in the case where the contained object
is itself an any.
<p/>
For the move constructor we don't simply want to construct from the
contrained object, because when the contained object is stored in
dynamic memory we don't actually construct anything, we just transfer
ownership of a pointer.
</p>

<p><i>[Issues Telecon 16-Dec-2016]</i></p>

<p>Move to Tentatively Ready</p>


<p id="res-2789"><b>Proposed resolution:</b></p>
<p>This wording is relative to N4606.</p>

<ol>
<li><p>Change [any.cons] p2:</p>
<blockquote>
<pre>
any(const any&amp; other);
</pre>
<blockquote>
<p>
<i>Effects:</i> <del>Constructs an object of type <code>any</code> with an equivalent
state as <code>other</code>.</del><ins>If <code>other.has_value()</code> is <code>false</code>, 
constructs an object that has no value. Otherwise, equivalent to 
<code>any(in_place&lt;T&gt;, any_cast&lt;const T&amp;&gt;(other))</code> where <code>T</code> 
is the type of the contained object.</ins>
</p>
</blockquote>
</blockquote>
</li>

<li><p>Change [any.cons] p4:</p>

<blockquote>
<pre>
any(any&amp;&amp; other);
</pre>
<blockquote>
<p>
<i>Effects:</i> <del>Constructs an object of type <code>any</code> with a state equivalent
to the original state of <code>other</code>.</del><ins>If <code>other.has_value()</code> is <code>false</code>, 
constructs an object that has no value. Otherwise, constructs an object of type <code>any</code> that contains
either the contained object of <code>other</code>, or contains an object of the same type constructed from 
the contained object of other considering that contained object as an rvalue.</ins>
</p>
</blockquote>
</blockquote>
</li>
</ol>





</body>
</html>
