<html><head><title>Constexpr Library Additions: complex</title><style type="text/css">ol{margin:0;padding:0}p{margin:0}.c4{color:#000000;font-size:14pt;font-family:Arial;font-weight:bold}.c9{color:#000000;font-size:24pt;font-family:Arial;font-weight:bold}.c10{color:#000099;font-size:11pt;text-decoration:underline;font-family:Arial}.c6{color:#000000;font-size:18pt;font-family:Arial;font-weight:bold}.c0{color:#000000;font-size:11pt;font-family:Arial;font-weight:bold}.c2{color:#000000;font-size:11pt;font-family:Arial}.c1{line-height:1.15;text-indent:0pt;direction:ltr}.c5{background-color:#ea9999;text-decoration:line-through}.c8{padding-top:14.0pt;padding-bottom:4.0pt}.c7{background-color:#ffffff}.c12{background-color:#cfe2f3}.c11{font-style:italic}.c3{background-color:#b6d7a8}</style></head><body class="c7"><p class="c1"><span class="c6">Constexpr Library Additions: complex</span></p><p class="c1"><span class="c9">&nbsp;</span></p><p class="c1"><span class="c2">ISO/IEC JTC1 SC22 WG21 N3228 = 10-0218 - 2010-11-24</span></p><p class="c1"><span class="c2">Benjamin Kosnik, </span><span class="c10"><a href="mailto:bkoz@redhat.com">bkoz@redhat.com</a></span></p><p class="c1"><span class="c2">Gabriel Dos Reis, gdr@integrable-solutions.net</span></p><p class="c1"><span class="c2">&nbsp;</span></p><p class="c1"><span class="c0">Addresses</span><span class="c4">: </span><span class="c2">LWG 2013</span></p><p class="c1"><span class="c2">&nbsp;</span></p><p class="c1"><span class="c2">&nbsp;</span></p><p class="c1"><span class="c4">Introduction</span></p><p class="c1"><span class="c6">&nbsp;</span></p><p class="c1"><span class="c2">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. Additional implementation experience has motivated the following changes and additions to the library specification. </span></p><p class="c1"><span class="c2">&nbsp;</span></p><p class="c1 c8"><span class="c4">Proposed Changes</span></p><p class="c1"><span class="c2">&nbsp;</span></p><p class="c1"><span class="c2">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="c0 c11"> </span><span class="c0 c3">in bold and green</span><span class="c2"> with the older text it is replacing </span><span class="c2 c5">struckthrough in red</span><span class="c2">.</span></p><p class="c1"><span class="c2">&nbsp;</span></p><p class="c1"><span class="c2">Add the following:</span></p><p class="c1"><span class="c2">&nbsp;</span></p><p class="c1"><span class="c2">&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="c1"><span class="c2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;constexpr.</span></p><p class="c1"><span class="c2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- Mark complex operators == and != constexpr.</span></p><p class="c1"><span class="c2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-</span><span class="c2 c12"> </span><span class="c2">Mark function templates real() and imag() &nbsp;constexpr.</span></p><p class="c1"><span class="c2">&nbsp;</span></p><p class="c1"><span class="c2">&nbsp;</span></p><p class="c1"><span class="c4">Proposed Wording</span></p><p class="c1"><span class="c2">&nbsp;</span></p><p class="c1"><span class="c0">a) Modify 26.4.1 as follows:</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c2">template&lt;class T&gt;</span></p><p class="c1"><span class="c2"> </span><span class="c0 c3">constexpr</span><span class="c2"> bool operator==(const complex&lt;T&gt;&amp;, const complex&lt;T&gt;&amp;);</span></p><p class="c1"><span class="c2">template&lt;class T&gt;</span></p><p class="c1"><span class="c2"> </span><span class="c0 c3">constexpr</span><span class="c2"> bool operator==(const complex&lt;T&gt;&amp;, const T&amp;);</span></p><p class="c1"><span class="c2">template&lt;class T&gt;</span></p><p class="c1"><span class="c2"> </span><span class="c0 c3">constexpr</span><span class="c2"> bool operator==(const T&amp;, const complex&lt;T&gt;&amp;);</span></p><p class="c1"><span class="c2">template&lt;class T&gt;</span></p><p class="c1"><span class="c2"> </span><span class="c0 c3">constexpr</span><span class="c2"> bool operator!=(const complex&lt;T&gt;&amp;, const complex&lt;T&gt;&amp;);</span></p><p class="c1"><span class="c2">template&lt;class T&gt;</span></p><p class="c1"><span class="c2"> </span><span class="c0 c3">constexpr</span><span class="c2"> bool operator!=(const complex&lt;T&gt;&amp;, const T&amp;);</span></p><p class="c1"><span class="c2">template&lt;class T&gt;</span></p><p class="c1"><span class="c2"> </span><span class="c0 c3">constexpr</span><span class="c2"> bool operator!=(const T&amp;, const complex&lt;T&gt;&amp;);</span></p><p class="c1"><span class="c2">&nbsp;</span></p><p class="c1"><span class="c0">b) Modify 26.4.2 as follows:</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c0 c3">constexpr</span><span class="c2"> complex(const T&amp; re = T(), const T&amp; im = T());</span></p><p class="c1"><span class="c0 c3">constexpr</span><span class="c2"> complex(const complex&amp;);</span></p><p class="c1"><span class="c2">template&lt;class X&gt; </span><span class="c0 c3">constexpr</span><span class="c2"> complex(const complex&lt;X&gt;&amp;);</span></p><p class="c1"><span class="c0 c3">constexpr</span><span class="c2"> T real() const;</span></p><p class="c1"><span class="c2">void real(T);</span></p><p class="c1"><span class="c0 c3">constexpr</span><span class="c2"> T imag() const;</span></p><p class="c1"><span class="c2">void imag(T);</span></p><p class="c1"><span class="c2">&nbsp;</span></p><p class="c1"><span class="c0">c) Modify 26.4.6 as follows:</span></p><p class="c1"><span class="c0">&nbsp;</span></p><p class="c1"><span class="c2">template&lt;class T&gt; </span><span class="c0 c3">constexpr</span><span class="c2"> bool</span></p><p class="c1"><span class="c2"> operator==(const complex&lt;T&gt;&amp; lhs, const complex&lt;T&gt;&amp; rhs);</span></p><p class="c1"><span class="c2">template&lt;class T&gt; </span><span class="c0 c3">constexpr</span><span class="c2"> bool</span></p><p class="c1"><span class="c2"> operator==(const complex&lt;T&gt;&amp; lhs, const T&amp; rhs);</span></p><p class="c1"><span class="c2">template&lt;class T&gt; </span><span class="c0 c3">constexpr</span><span class="c2"> bool</span></p><p class="c1"><span class="c2"> operator==(const T&amp; lhs, const complex&lt;T&gt;&amp; rhs);</span></p><p class="c1"><span class="c2">&nbsp;</span></p><p class="c1"><span class="c2">template&lt;class T&gt; </span><span class="c0 c3">constexpr</span><span class="c2"> bool</span></p><p class="c1"><span class="c2"> operator!=(const complex&lt;T&gt;&amp; lhs, const complex&lt;T&gt;&amp; rhs);</span></p><p class="c1"><span class="c2">template&lt;class T&gt; </span><span class="c0 c3">constexpr</span><span class="c2"> bool</span></p><p class="c1"><span class="c2"> operator!=(const complex&lt;T&gt;&amp; lhs, const T&amp; rhs);</span></p><p class="c1"><span class="c2">template&lt;class T&gt; </span><span class="c0 c3">constexpr</span><span class="c2"> bool</span></p><p class="c1"><span class="c2"> operator!=(const T&amp; lhs, const complex&lt;T&gt;&amp; rhs);</span></p><p class="c1"><span class="c2">&nbsp;</span></p><p class="c1"><span class="c2">d) Modify 26.4.7 as follows:</span></p><p class="c1"><span class="c2">&nbsp;</span></p><p class="c1"><span class="c2">template&lt;class T&gt; </span><span class="c0 c3">constexpr</span><span class="c2"> T real(const complex&lt;T&gt;&amp; x);</span></p><p class="c1"><span class="c2">template&lt;class T&gt; </span><span class="c0 c3">constexpr</span><span class="c2"> T imag(const complex&lt;T&gt;&amp; x);</span></p><p class="c1"><span class="c2">&nbsp;</span></p><p class="c1"><span class="c2"> </span></p><p class="c1"><span class="c4">Acknowledgments</span></p><p class="c1"><span class="c2">&nbsp;</span></p><p class="c1"><span class="c2">Many thanks to Jason Merrill, Paolo Carlini, and Jonathan Wakely for reviewing this document and providing assistance.</span></p></body></html>