<html><head><title>Constexpr Library Additions: utilities</title><style type="text/css">ol{margin:0;padding:0}p{margin:0}.c6{color:#000099;font-size:11pt;text-decoration:underline;font-family:Arial}.c0{color:#000000;font-size:11pt;font-family:Arial}.c5{color:#000000;font-size:24pt;font-family:Arial}.c4{color:#000000;font-size:14pt;font-family:Arial}.c9{color:#000000;font-size:18pt;font-family:Arial}.c1{line-height:1.15;text-indent:0pt;direction:ltr}.c10{background-color:#ea9999;text-decoration:line-through}.c11{padding-top:14.0pt;padding-bottom:4.0pt}.c2{font-weight:bold}.c8{background-color:#ffffff}.c3{background-color:#b6d7a8}.c7{font-style:italic}</style></head><body class="c8"><p class="c1"><span class="c2 c9">Constexpr Library Additions: support/utilities</span></p><p class="c1"><span class="c2 c5">&nbsp;</span></p><p class="c1"><span class="c0">ISO/IEC JTC1 SC22 WG21 N3231 = 10-0221 - 2010-11-24</span></p><p class="c1"><span class="c0">Benjamin Kosnik, </span><span class="c6"><a href="mailto:bkoz@redhat.com">bkoz@redhat.com</a></span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0 c2">Addresses</span><span class="c4 c2">: </span><span class="c0">LWG 2013</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c4 c2">Introduction</span></p><p class="c1"><span class="c9 c2">&nbsp;</span></p><p class="c1"><span class="c0">This paper details use of the ISO C++0x constexpr feature, as initially introduced in &ldquo;Generalized Constant Expressions &mdash; Revision 5&rdquo; (N2235) and incorporating all other subsequent changes as per ISO C++ draft N3126. Several CWG issues also influence the language with respect to constexpr: see issues 1099, 1125, 1194, 1195, 1197, 1198, 1199 and c++-std-core postings number 17890 and 17912. For pair and tuple, see N3140. Additional implementation experience has motivated the following changes and additions to the library specification. </span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1 c11"><span class="c4 c2">Proposed Changes</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0">A list of additional places in Chapters 18 Support or 20 Utilities that can exploit the constexpr language feature is below. For the changes listed, the new text is put in place</span><span class="c0 c2 c7"> </span><span class="c0 c2 c3">in bold and green</span><span class="c0"> with the older text it is replacing </span><span class="c0 c10">struckthrough in red</span><span class="c0">.</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0 c2">01. &lt;initializer_list&gt;</span></p><p class="c1"><span class="c0 c2">&nbsp;</span></p><p class="c1"><span class="c0">Add the following:</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- Mark class template initializer_list&rsquo;s default constructor and member functions &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p class="c1"><span class="c0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;size, begin, and end constexpr.</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- Mark function templates begin and end constexpr.</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0 c2">02. &lt;utility&gt;</span></p><p class="c1"><span class="c0 c2">&nbsp;</span></p><p class="c1"><span class="c0">Add the following:</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- Mark pair copy and non-move constructors constexpr.</span></p><p class="c1"><span class="c0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- Mark pair comparison operators ==, !=, &gt;, &gt;=, &lt;, &lt;= constexpr.</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0 c2">03. &lt;tuple&gt;</span></p><p class="c1"><span class="c0 c2">&nbsp;</span></p><p class="c1"><span class="c0">Add the following:</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- Mark tuple copy and non-move constructor constexpr.</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c2 c4">Proposed wording</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0 c2">a) Modify 18.9 as follows:</span></p><p class="c1"><span class="c0 c2">&nbsp;</span></p><p class="c1"><span class="c0 c2">constexpr</span><span class="c0"> initializer_list();</span></p><p class="c1"><span class="c0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p class="c1"><span class="c0 c2 c3">constexpr</span><span class="c0"> size_t size() const;</span></p><p class="c1"><span class="c0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p class="c1"><span class="c0 c2 c3">constexpr</span><span class="c0"> const E* begin() const;</span></p><p class="c1"><span class="c0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p class="c1"><span class="c0 c2 c3">constexpr</span><span class="c0"> const E* end() const;</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0 c2">b) Modify 18.9.1 as follows:</span></p><p class="c1"><span class="c0 c2">&nbsp;</span></p><p class="c1"><span class="c0 c2 c3">constexpr</span><span class="c0"> initializer_list();</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0 c2">c) Modify 18.9.2 as follows:</span></p><p class="c1"><span class="c0 c2">&nbsp;</span></p><p class="c1"><span class="c0 c2 c3">constexpr</span><span class="c0"> const E* begin() const;</span></p><p class="c1"><span class="c0 c2 c3">constexpr</span><span class="c0"> const E* end() const;</span></p><p class="c1"><span class="c0 c2 c3">constexpr</span><span class="c0"> size_t size() const;</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0 c2">d) Modify 18.9.3 as follows:</span></p><p class="c1"><span class="c0 c2">&nbsp;</span></p><p class="c1"><span class="c0">template&lt;class E&gt; </span><span class="c0 c2 c3">constexpr</span><span class="c0"> const E* begin(initializer_list&lt;E&gt; il);</span></p><p class="c1"><span class="c0"> </span></p><p class="c1"><span class="c0 c2">e) Modify 20.3.5.2 &nbsp;as follows:</span></p><p class="c1"><span class="c0 c2">&nbsp;</span></p><p class="c1"><span class="c0 c2 c3">constexpr</span><span class="c0"> pair(const pair&amp;) = default;</span></p><p class="c1"><span class="c0">constexpr pair();</span></p><p class="c1"><span class="c0 c2 c3">constexpr</span><span class="c0"> pair(const T1&amp; x, const T2&amp; y);</span></p><p class="c1"><span class="c0">template&lt;class U, class V&gt; pair(U&amp;&amp; x, V&amp;&amp; y);</span></p><p class="c1"><span class="c0">template&lt;class U, class V&gt; </span><span class="c0 c2 c3">constexpr</span><span class="c0"> pair(const pair&lt;U, V&gt;&amp; p);</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0 c2">f) Modify 20.3.5.3 as follows:</span></p><p class="c1"><span class="c0 c2">&nbsp;</span></p><p class="c1"><span class="c0">template &lt;class T1, class T2&gt;</span></p><p class="c1"><span class="c0"> </span><span class="c0 c2 c3">constexpr</span><span class="c0"> bool operator==(const pair&lt;T1, T2&gt;&amp; x, const pair&lt;T1, T2&gt;&amp; y);</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0">template &lt;class T1, class T2&gt;</span></p><p class="c1"><span class="c0"> </span><span class="c0 c2 c3">constexpr</span><span class="c0"> bool operator&lt;(const pair&lt;T1, T2&gt;&amp; x, const pair&lt;T1, T2&gt;&amp; y);</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0">template &lt;class T1, class T2&gt;</span></p><p class="c1"><span class="c0"> </span><span class="c0 c2 c3">constexpr</span><span class="c0"> bool operator!=(const pair&lt;T1, T2&gt;&amp; x, const pair&lt;T1, T2&gt;&amp; y);</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0">template &lt;class T1, class T2&gt;</span></p><p class="c1"><span class="c0"> </span><span class="c0 c2 c3">constexpr</span><span class="c0"> bool operator&gt;(const pair&lt;T1, T2&gt;&amp; x, const pair&lt;T1, T2&gt;&amp; y);</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0">template &lt;class T1, class T2&gt;</span></p><p class="c1"><span class="c0"> </span><span class="c0 c2 c3">constexpr</span><span class="c0"> bool operator&gt;=(const pair&lt;T1, T2&gt;&amp; x, const pair&lt;T1, T2&gt;&amp; y);</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0">template &lt;class T1, class T2&gt;</span></p><p class="c1"><span class="c0"> </span><span class="c0 c2 c3">constexpr</span><span class="c0"> bool operator&lt;=(const pair&lt;T1, T2&gt;&amp; x, const pair&lt;T1, T2&gt;&amp; y);</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0 c2">g) Modify 20.4.2 as follows:</span></p><p class="c1"><span class="c0 c2">&nbsp;</span></p><p class="c1"><span class="c0">explicit </span><span class="c0 c2 c3">constexpr</span><span class="c0"> tuple(const Types&amp;...);</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0 c2 c3">constexpr</span><span class="c0"> tuple(const tuple&amp;) = default;</span></p><p class="c1"><span class="c0 c2">&nbsp;</span></p><p class="c1"><span class="c0 c2">g) Modify 20.4.2.1 as follows:</span></p><p class="c1"><span class="c0 c2">&nbsp;</span></p><p class="c1"><span class="c0">explicit </span><span class="c0 c2 c3">constexpr</span><span class="c0"> tuple(const Types&amp;...);</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0 c2 c3">constexpr</span><span class="c0"> tuple(const tuple&amp;) = default;</span></p><p class="c1"><span class="c0 c2">&nbsp;</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c4 c2">Acknowledgments</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0">Many thanks to Daniel Kr&uuml;gler, Alisdair Meredith, &nbsp;Jason Merrill, Paolo Carlini, and Jonathan Wakely for reviewing this document and providing assistance.</span></p></body></html>