<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 2886: Keep the empty() functions in any</title>
<meta property="og:title" content="Issue 2886: Keep the empty() functions in any">
<meta property="og:description" content="C++ library issue. Status: NAD">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue2886.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#NAD">NAD</a> status.</em></p>
<h3 id="2886"><a href="lwg-closed.html#2886">2886</a>. Keep the <code>empty()</code> functions in <code>any</code></h3>
<p><b>Section:</b> 22.7.4.5 <a href="https://wg21.link/any.observers">[any.observers]</a> <b>Status:</b> <a href="lwg-active.html#NAD">NAD</a>
 <b>Submitter:</b> Finland <b>Opened:</b> 2017-02-03 <b>Last modified:</b> 2020-09-06</p>
<p><b>Priority: </b>Not Prioritized
</p>
<p><b>View all issues with</b> <a href="lwg-status.html#NAD">NAD</a> status.</p>
<p><b>Discussion:</b></p>
<b>Addresses FI 7</b>

<p>The proposal <a href="https://wg21.link/p0032">p0032</a> has multiple problems: 1) it turns member function <code>.empty()</code> 
into <code>.has_value()</code>, negating the logic. Refactoring e.g. existing uses of <code>std::experimental::any</code> to use 
<code>std::any</code> thus involve non-trivial refactorings that are error- prone and can't be done via simple search-and-replace 
if there are containers in the same source files for which <code>.empty()</code> is used (based on the implementation experience 
of making the change in libstdc++ and refactoring the testsuite). Whilst <code>any</code> is not a container, the library is failing 
to go towards a direction where there would be a generic way to query for emptiness. 2) The use of function references for 
tag types makes the interface hard to use. The tag types do not have value semantics like every other tag type has, the tag 
types are hard to construct, and present surprises for certain kinds of overload sets. Furthermore, any attempts to decay the 
tag types produces a really surprising effect &mdash; as opposed to what the other tag types do, which is that the result of 
decaying them is the tag type itself, decaying these new tag types results in a pointer to function.</p>

<p>Proposed change: Keep the <code>.empty()</code> functions (and introduce them to all the types that are supposed to have a 
homogeneous interface), and make the tag types be regular tag types that are not references to functions.</p>

<p><i>[2017-02-03, Marshall notes]</i></p>

<p><a href="https://wg21.link/p0504r0">P0504R0</a> (adopted in Issaquah) removed use of function references for tag types</p>

<p><i>[
2017-06-26 Moved to Tentatively NAD after 5 positive votes on c++std-lib.
]</i></p>



<p id="res-2886"><b>Proposed resolution:</b></p>
<p>
</p>






</body>
</html>
