<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 2446: Unspecialized std::tuple_size should be defined</title>
<meta property="og:title" content="Issue 2446: Unspecialized std::tuple_size should be defined">
<meta property="og:description" content="C++ library issue. Status: NAD">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue2446.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="2446"><a href="lwg-closed.html#2446">2446</a>. Unspecialized <code>std::tuple_size</code> should be defined</h3>
<p><b>Section:</b> 22.4.1 <a href="https://wg21.link/tuple.general">[tuple.general]</a> <b>Status:</b> <a href="lwg-active.html#NAD">NAD</a>
 <b>Submitter:</b> Nevin Liber <b>Opened:</b> 2014-10-10 <b>Last modified:</b> 2018-06-23</p>
<p><b>Priority: </b>Not Prioritized
</p>
<p><b>View all other</b> <a href="lwg-index.html#tuple.general">issues</a> in [tuple.general].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#NAD">NAD</a> status.</p>
<p><b>Discussion:</b></p>
<p>
In 22.4.1 <a href="https://wg21.link/tuple.general">[tuple.general]</a> paragraph 2, the unspecialized <code>std::tuple_size</code> is undefined. It would 
be a lot more useful with SFINAE if it were defined as an empty struct; that way, it can be used with <code>enable_if</code> 
for determining whether or not it is valid to use <code>tuple_size</code>, <code>tuple_element</code> and get on the 
corresponding data structure.
</p>

<p><i>[2014-11 Urbana]</i></p>

<p>Moved to LEWG 42.</p>
<p>
This request goes beyond simply making an API respond well to SFINAE, but coupling that with an
implication for other tuple APIs.  The proper place for such design discussions is LEWG.
</p>

<p><i>[2017-02 in Kona, LEWG recommends NAD]</i></p>

<p>We believe there are other ways to achieve the same results (at least for 
all of the use cases we could see). We invite Nevin to provide more details / 
motivations if this is necessary, not just helpful in a limited number of cases.
If the dr is raised, variant_size should be considered for the same change as well.</p>

<p><i>[2017-06-02 Issues Telecon]</i></p>

<p>It's unclear what benefit this change would have, but making it complete would
have very undesirable interactions with structured bindings. The current Core
wording for structured bindings depends on tuple_size being an incomplete type.
</p>
<p>Resolve as NAD</p>


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

<ol>
<li><p>Change 22.4.1 <a href="https://wg21.link/tuple.general">[tuple.general]</a> p2, header <code>&lt;tuple&gt;</code> synopsis, as indicated</p>
<blockquote>
<pre>
[&hellip;]
// <i>20.4.2.5, tuple helper classes</i>:
template &lt;class T&gt; class tuple_size; <del>// undefined</del>
[&hellip;]
</pre>
</blockquote>
</li>

<li><p>Change 22.4.7 <a href="https://wg21.link/tuple.helper">[tuple.helper]</a> as indicated</p>
<blockquote>
<pre>
[&hellip;]
template &lt;class T&gt; struct tuple_size <ins>{ }</ins>;
[&hellip;]
</pre>
</blockquote>
</li>
</ol>





</body>
</html>
