Skip to content

Commit 76a3faa

Browse files
committed
New issue from Jiang An: "Contradictory specification of std::tuple_size"
1 parent d62c140 commit 76a3faa

File tree

1 file changed

+49
-0
lines changed

1 file changed

+49
-0
lines changed

xml/issue4040.xml

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?xml version='1.0' encoding='utf-8' standalone='no'?>
2+
<!DOCTYPE issue SYSTEM "lwg-issue.dtd">
3+
4+
<issue num="4040" status="New">
5+
<title>Contradictory specification of <tt>std::tuple_size</tt></title>
6+
<section><sref ref="[ostream.formatted.print]"/></section>
7+
<submitter>Jiang An</submitter>
8+
<date>20 Jan 2024</date>
9+
<priority>99</priority>
10+
11+
<discussion>
12+
<p>
13+
<sref ref="[tuple.helper]"/>/1 currently says:
14+
</p>
15+
<blockquote>
16+
<p>
17+
All specializations of <tt>tuple_size</tt> meet the <i>Cpp17UnaryTypeTrait</i> requirements
18+
(<sref ref="[meta.rqmts]"/>) with a base characteristic of <tt>integral_constant&lt;size_t, N&gt;</tt>
19+
for some <tt>N</tt>.
20+
</p>
21+
</blockquote>
22+
<p>
23+
which is probably wrong for <tt>std::tuple_size&lt;int&gt;</tt> and
24+
<tt>std::tuple_size&lt;std::vector&lt;int&gt;&gt;</tt> whose definitions are not provided, and
25+
contradicts with <sref ref="[tuple.helper]"/>/4
26+
</p>
27+
<blockquote>
28+
<p>
29+
[&hellip;] Otherwise, it has no member <tt>value</tt>.
30+
</p>
31+
</blockquote>
32+
<p>
33+
Also, there's currently implementation divergence on whether <tt>std::tuple_size&lt;<i>cv</i> T&gt;</tt>
34+
is a complete type when <tt>std::tuple_size&lt;T&gt;::value</tt> is absent (related to LWG <iref ref="2770"/>).
35+
Some implementations (e.g.
36+
<a href="https://github.com/llvm/llvm-project/blob/b1d4265a5f5345065e5c2aedf50787da05ddcc08/libcxx/include/__tuple/tuple_size.h#L29-L47">libc++</a>
37+
and <a href="https://github.com/gcc-mirror/gcc/blob/615e25c82de97acc17ab438f88d6788cf7ffe1d6/libstdc%2B%2B-v3/include/bits/utility.h#L55-L71">libstdc++</a>)
38+
treat <sref ref="[tuple.helper]"/>/4 and <sref ref="[depr.tuple]"/>/2 as "<tt>std::tuple_size&lt;<i>cv</i> T&gt;</tt>
39+
is generated from partial specializations only if <tt>std::tuple_size&lt;T&gt;</tt> meets the aforementioned conditions",
40+
while others (e.g. <a href="https://github.com/microsoft/STL/blob/442029c6fa37f1b6f9203357de09672d5704077c/stl/inc/utility#L598-L612">MSVC STL</a>)
41+
always consider <tt>std::tuple_size&lt;<i>cv</i> T&gt;</tt> needs to be defined. The latter
42+
reading seems to be justified by <sref ref="[contents]"/>/1 and <sref ref="[tuple.syn]"/>.
43+
</p>
44+
</discussion>
45+
46+
<resolution>
47+
</resolution>
48+
49+
</issue>

0 commit comments

Comments
 (0)