<html><head><title>Constexpr Library Additions v2: complex</title><style type="text/css">ol{margin:0;padding:0}p{margin:0}.c11{width:468pt;background-color:#ffffff;padding:72pt 72pt 72pt 72pt}.c0{background-color:#ea9999;text-decoration:line-through}.c9{color:#000099;text-decoration:underline}.c2{font-size:24pt;font-weight:bold}.c12{color:inherit;text-decoration:inherit}.c1{background-color:#b6d7a8;font-weight:bold}.c5{font-size:18pt;font-weight:bold}.c10{font-style:italic}.c3{direction:ltr}.c4{height:11pt}.c8{font-size:14pt}.c7{font-weight:bold}.c6{background-color:#cfe2f3}body{color:#000000;font-size:11pt;font-family:Arial}h1{padding-top:24pt;color:#000000;font-size:24pt;font-family:Arial;font-weight:bold;padding-bottom:6pt}h2{padding-top:18pt;color:#000000;font-size:18pt;font-family:Arial;font-weight:bold;padding-bottom:4pt}h3{padding-top:14pt;color:#000000;font-size:14pt;font-family:Arial;font-weight:bold;padding-bottom:4pt}h4{padding-top:12pt;color:#000000;font-size:12pt;font-family:Arial;font-weight:bold;padding-bottom:2pt}h5{padding-top:11pt;color:#000000;font-size:11pt;font-family:Arial;font-weight:bold;padding-bottom:2pt}h6{padding-top:10pt;color:#000000;font-size:10pt;font-family:Arial;font-weight:bold;padding-bottom:2pt}</style></head><body class="c11"><p class="c3"><span class="c5">Constexpr Library Additions: complex</span><span class="c5">, v2</span></p><p class="c3 c4"><span class="c2"></span></p><p class="c3"><span>ISO/IEC JTC1 SC22 WG21 </span><span>N3302</span><span>&nbsp;= </span><span>11-0072 -</span><span>&nbsp;201</span><span>1</span><span>-</span><span>08</span><span>-2</span><span>0</span></p><p class="c3"><span>Benjamin Kosnik, </span><span class="c9"><a class="c12" href="mailto:bkoz@redhat.com">bkoz@redhat.com</a></span></p><p class="c3"><span>Gabriel Dos Reis, gdr@integrable-solutions.net</span></p><p class="c3"><span>Daniel Krugler, daniel.kruegler@googlemail.com&gt;</span></p><p class="c3"><span class="c7">Addresses</span><span class="c8 c7">: </span><span>LWG 2013</span></p><p class="c3 c4"><span></span></p><p class="c3 c4"><span></span></p><p class="c3"><span class="c8 c7">Introduction</span></p><p class="c3 c4"><span class="c5"></span></p><p class="c3"><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>291</span><span>. It is </span><span>the first</span><span>&nbsp;revision of N3228. 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, and subsequent changes to the core language have motivated the following changes and additions to the library specification. </span></p><p class="c3 c4"><span></span></p><h3 class="c3"><span class="c7 c8">Proposed Changes</span></h3><p class="c3 c4"><span></span></p><p class="c3"><span>A list of additional places in 26.4 Complex numbers aka std::complex that can exploit the constexpr language feature is below. For the changes listed, the new text is put in place</span><span class="c7 c10">&nbsp;</span><span class="c1">in bold and green</span><span>&nbsp;with the older text it is replacing </span><span class="c0">struckthrough in red</span><span>.</span></p><p class="c3 c4"><span></span></p><p class="c3"><span>Add the following:</span></p><p class="c3 c4"><span></span></p><p class="c3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- Mark primary template constructors and real() and imag() member functions &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p class="c3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; constexpr.</span></p><p class="c3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- Mark complex operators == and != constexpr.</span></p><p class="c3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-</span><span class="c6">&nbsp;</span><span>Mark function templates real() and imag() &nbsp;constexpr.</span></p><p class="c3 c4"><span></span></p><p class="c3 c4"><span></span></p><p class="c3"><span class="c8 c7">Proposed Wording</span></p><p class="c3 c4"><span></span></p><p class="c3"><span class="c7">a) Modify 26.4.1 [complex.syn] as follows:</span></p><p class="c3 c4"><span class="c7"></span></p><p class="c3"><span>template&lt;class T&gt;</span></p><p class="c3"><span>&nbsp;</span><span class="c1">constexpr</span><span>&nbsp;bool operator==(const complex&lt;T&gt;&amp;, const complex&lt;T&gt;&amp;);</span></p><p class="c3"><span>template&lt;class T&gt;</span></p><p class="c3"><span>&nbsp;</span><span class="c1">constexpr</span><span>&nbsp;bool operator==(const complex&lt;T&gt;&amp;, const T&amp;);</span></p><p class="c3"><span>template&lt;class T&gt;</span></p><p class="c3"><span>&nbsp;</span><span class="c1">constexpr</span><span>&nbsp;bool operator==(const T&amp;, const complex&lt;T&gt;&amp;);</span></p><p class="c3"><span>template&lt;class T&gt;</span></p><p class="c3"><span>&nbsp;</span><span class="c1">constexpr</span><span>&nbsp;bool operator!=(const complex&lt;T&gt;&amp;, const complex&lt;T&gt;&amp;);</span></p><p class="c3"><span>template&lt;class T&gt;</span></p><p class="c3"><span>&nbsp;</span><span class="c1">constexpr</span><span>&nbsp;bool operator!=(const complex&lt;T&gt;&amp;, const T&amp;);</span></p><p class="c3"><span>template&lt;class T&gt;</span></p><p class="c3"><span>&nbsp;</span><span class="c1">constexpr</span><span>&nbsp;bool operator!=(const T&amp;, const complex&lt;T&gt;&amp;);</span></p><p class="c3 c4"><span></span></p><p class="c3"><span>template&lt;class T&gt; </span><span class="c1">constexpr</span><span>&nbsp;</span><span>T real(const complex&lt;T&gt;&amp;);</span></p><p class="c3"><span>template&lt;class T&gt; </span><span class="c1">constexpr</span><span>&nbsp;T imag(const complex&lt;T&gt;&amp;);</span></p><p class="c3 c4"><span></span></p><p class="c3 c4"><span></span></p><p class="c3"><span class="c7">b) Modify 26.4.2 [complex] as follows:</span></p><p class="c3 c4"><span class="c7"></span></p><p class="c3"><span class="c1">constexpr</span><span>&nbsp;complex(const T&amp; re = T(), const T&amp; im = T());</span></p><p class="c3"><span class="c1">constexpr</span><span>&nbsp;complex(const complex&amp;);</span></p><p class="c3"><span>template&lt;class X&gt; </span><span class="c1">constexpr</span><span>&nbsp;complex(const complex&lt;X&gt;&amp;);</span></p><p class="c3"><span class="c1">constexpr</span><span>&nbsp;T real() const;</span></p><p class="c3"><span>void real(T);</span></p><p class="c3"><span class="c1">constexpr</span><span>&nbsp;T imag() const;</span></p><p class="c3"><span>void imag(T);</span></p><p class="c3 c4"><span></span></p><p class="c3"><span class="c7">c) Modify 26.4.6 [complex.ops] as follows:</span></p><p class="c3 c4"><span class="c7"></span></p><p class="c3"><span>template&lt;class T&gt; </span><span class="c1">constexpr</span><span>&nbsp;bool</span></p><p class="c3"><span>&nbsp;operator==(const complex&lt;T&gt;&amp; lhs, const complex&lt;T&gt;&amp; rhs);</span></p><p class="c3"><span>template&lt;class T&gt; </span><span class="c1">constexpr</span><span>&nbsp;bool</span></p><p class="c3"><span>&nbsp;operator==(const complex&lt;T&gt;&amp; lhs, const T&amp; rhs);</span></p><p class="c3"><span>template&lt;class T&gt; </span><span class="c1">constexpr</span><span>&nbsp;bool</span></p><p class="c3"><span>&nbsp;operator==(const T&amp; lhs, const complex&lt;T&gt;&amp; rhs);</span></p><p class="c3 c4"><span></span></p><p class="c3"><span>template&lt;class T&gt; </span><span class="c1">constexpr</span><span>&nbsp;bool</span></p><p class="c3"><span>&nbsp;operator!=(const complex&lt;T&gt;&amp; lhs, const complex&lt;T&gt;&amp; rhs);</span></p><p class="c3"><span>template&lt;class T&gt; </span><span class="c1">constexpr</span><span>&nbsp;bool</span></p><p class="c3"><span>&nbsp;operator!=(const complex&lt;T&gt;&amp; lhs, const T&amp; rhs);</span></p><p class="c3"><span>template&lt;class T&gt; </span><span class="c1">constexpr</span><span>&nbsp;bool</span></p><p class="c3"><span>&nbsp;operator!=(const T&amp; lhs, const complex&lt;T&gt;&amp; rhs);</span></p><p class="c3 c4"><span></span></p><p class="c3"><span class="c7">d) Modify 26.4.7 </span><span class="c7">[complex.value.ops] </span><span class="c7">as follows:</span></p><p class="c3 c4"><span></span></p><p class="c3"><span>template&lt;class T&gt; </span><span class="c1">constexpr</span><span>&nbsp;T real(const complex&lt;T&gt;&amp; x);</span></p><p class="c3"><span>template&lt;class T&gt; </span><span class="c1">constexpr</span><span>&nbsp;T imag(const complex&lt;T&gt;&amp; x);</span></p><p class="c3 c4"><span></span></p><p class="c3"><span>&nbsp;</span></p><p class="c3"><span class="c8 c7">Acknowledgments</span></p><p class="c3 c4"><span></span></p><p class="c3"><span>Many thanks to Jason Merrill, Paolo Carlini, and Jonathan Wakely for reviewing this document and providing assistance.</span></p></body></html>