<html><head><title>Constexpr Library Additions v2: containers</title><style type="text/css">ol{margin:0;padding:0}.c0{font-size:9pt;background-color:#b6d7a8;font-weight:bold}.c13{max-width:468pt;background-color:#ffffff;padding:72pt 72pt 72pt 72pt}.c8{background-color:#ea9999;text-decoration:line-through}.c3{font-size:18pt;font-weight:bold}.c7{color:#000099;text-decoration:underline}.c11{color:inherit;text-decoration:inherit}.c5{font-weight:bold}.c9{font-size:14pt}.c2{height:11pt}.c1{direction:ltr}.c12{font-style:italic}.c6{font-size:24pt}.c4{font-size:9pt}.c10{background-color:#b6d7a8}.title{padding-top:24pt;line-height:1.15;text-align:left;color:#000000;font-size:36pt;font-family:"Arial";font-weight:bold;padding-bottom:6pt}.subtitle{padding-top:18pt;line-height:1.15;text-align:left;color:#666666;font-style:italic;font-size:24pt;font-family:"Georgia";padding-bottom:4pt}li{color:#000000;font-size:11pt;font-family:"Arial"}p{color:#000000;font-size:11pt;margin:0;font-family:"Arial"}h1{padding-top:24pt;line-height:1.15;text-align:left;color:#000000;font-size:24pt;font-family:"Arial";font-weight:bold;padding-bottom:6pt}h2{padding-top:18pt;line-height:1.15;text-align:left;color:#000000;font-size:18pt;font-family:"Arial";font-weight:bold;padding-bottom:4pt}h3{padding-top:14pt;line-height:1.15;text-align:left;color:#000000;font-size:14pt;font-family:"Arial";font-weight:bold;padding-bottom:4pt}h4{padding-top:12pt;line-height:1.15;text-align:left;color:#000000;font-size:12pt;font-family:"Arial";font-weight:bold;padding-bottom:2pt}h5{padding-top:11pt;line-height:1.15;text-align:left;color:#000000;font-size:11pt;font-family:"Arial";font-weight:bold;padding-bottom:2pt}h6{padding-top:10pt;line-height:1.15;text-align:left;color:#000000;font-size:10pt;font-family:"Arial";font-weight:bold;padding-bottom:2pt}</style></head><body class="c13"><p class="c1"><span class="c3">Constexpr Library Additions: </span><span class="c3">containers, v2</span></p><p class="c2 c1"><span class="c5 c6"></span></p><p class="c1"><span>ISO/IEC JTC1 SC22 WG21 </span><span>N3470</span><span>&nbsp;= 12-0160</span></p><p class="c1"><span>2</span><span>01</span><span>2-10-18</span></p><p class="c1"><span>Benjamin Kosnik, </span><span class="c7"><a class="c11" href="mailto:bkoz@redhat.com">bkoz@redhat.com</a></span></p><p class="c1"><span>Daniel Krugler, daniel.kruegler@googlemail.com</span></p><p class="c2 c1"><span></span></p><p class="c1"><span class="c5 c9">Introduction</span></p><p class="c2 c1"><span class="c3"></span></p><p class="c1"><span>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 N3</span><span>376</span><span>. This is the </span><span>first revision of N3304, Constexpr Library Additions: containers. </span><span>Several CWG issues have also influenced the language with respect to constexpr: see issues 1099, 1125, 1194, 1195, 1197, 1198, 1199 and c++-std-core postings number 17890 and 17912. Additional implementation experience</span><span>, and subsequent changes to the core language </span><span>ha</span><span>ve</span><span>&nbsp;motivated the following changes and additions to the library specification. </span></p><p class="c2 c1"><span></span></p><h3 class="c1"><span class="c5 c9">Proposed Changes</span></h3><p class="c2 c1"><span></span></p><p class="c1"><span>A list of additional places in 2</span><span>3.3.2</span><span>&nbsp;</span><span>Class template array</span><span>&nbsp;that can exploit the constexpr language feature is below. For the changes listed, the new text is put in place</span><span class="c5 c12">&nbsp;</span><span class="c5 c10">in bold and green</span><span>&nbsp;with the older text it is replacing </span><span class="c8">struckthrough in red</span><span>.</span></p><p class="c2 c1"><span></span></p><p class="c2 c1"><span></span></p><p class="c1"><span class="c5 c9">Proposed wording</span></p><p class="c2 c1"><span></span></p><p class="c1"><span class="c5">a) Modify 2</span><span class="c5">3.3</span><span class="c5">.2.1 [</span><span class="c5">array</span><span class="c5">.</span><span class="c5">overview</span><span class="c5">]</span><span class="c5">&nbsp;</span><span class="c5">&nbsp;as follows:</span></p><p class="c2 c1"><span class="c5"></span></p><p class="c1"><span class="c4">reference</span></p><p class="c1"><span class="c4">operator[](size_type n);</span></p><p class="c2 c1"><span class="c4"></span></p><p class="c1"><span class="c0">constexpr</span><span class="c4">&nbsp;const_reference </span></p><p class="c1"><span class="c4">operator[](size_type n) const;</span></p><p class="c2 c1"><span class="c4"></span></p><p class="c1"><span class="c4">reference</span></p><p class="c1"><span class="c4">at(size_type n);</span></p><p class="c2 c1"><span class="c4"></span></p><p class="c1"><span class="c0">constexpr</span><span class="c4">&nbsp;const_reference </span></p><p class="c1"><span class="c4">at(size_type n) const;</span></p><p class="c1 c2"><span class="c4"></span></p><p class="c1"><span class="c4">reference</span></p><p class="c1"><span class="c4">front();</span></p><p class="c2 c1"><span class="c4"></span></p><p class="c1"><span class="c0">constexpr</span><span class="c4">&nbsp;const_reference </span></p><p class="c1"><span class="c4">front() const;</span></p><p class="c2 c1"><span class="c4"></span></p><p class="c1"><span class="c4">reference</span></p><p class="c1"><span class="c4">back();</span></p><p class="c2 c1"><span class="c4"></span></p><p class="c1"><span class="c0">constexpr</span><span class="c4">&nbsp;const_reference </span></p><p class="c1"><span class="c4">back() const;</span></p><p class="c2 c1"><span class="c4"></span></p><p class="c2 c1"><span class="c4"></span></p><p class="c1"><span class="c5">b) Modify 23.3.2.9 [array.tuple] &nbsp;as follows:</span></p><p class="c2 c1"><span class="c4"></span></p><p class="c1"><span class="c4">template &lt;size_t I, class T, size_t N&gt; </span></p><p class="c1"><span class="c0">constexpr</span><span class="c4">&nbsp;T&amp; get(array&lt;T, N&gt;&amp; a) noexcept;</span></p><p class="c2 c1"><span class="c4"></span></p><p class="c1"><span class="c4">template &lt;size_t I, class T, size_t N&gt; </span></p><p class="c1"><span class="c0">constexpr</span><span class="c4">&nbsp;T&amp;&amp; get(array&lt;T, N&gt;&amp;&amp; a) noexcept;</span></p><p class="c2 c1"><span class="c4"></span></p><p class="c1"><span class="c4">template &lt;size_t I, class T, size_t N&gt; </span></p><p class="c1"><span class="c0">constexpr</span><span class="c4">&nbsp;const T&amp; get(const array&lt;T, N&gt;&amp; a) noexcept;</span></p><p class="c2 c1"><span></span></p><p class="c2 c1"><span></span></p><p class="c1"><span class="c5 c9">Acknowledgments</span></p><p class="c2 c1"><span></span></p><p class="c1"><span>Many thanks to Jason Merrill, Paolo Carlini, and Jonathan Wakely for reviewing this document and providing assistance.</span></p></body></html>