<html><head><title>Constexpr Library Additions v3: chrono</title><style type="text/css">ol{margin:0;padding:0}.c13{max-width:468pt;background-color:#ffffff;padding:72pt 72pt 72pt 72pt}.c1{height:11pt;direction:ltr}.c9{background-color:#e06666;text-decoration:line-through}.c2{color:#000099;text-decoration:underline}.c14{color:inherit;text-decoration:inherit}.c12{background-color:#ea9999;text-decoration:line-through}.c4{font-size:9pt}.c3{direction:ltr}.c6{font-size:14pt}.c10{text-indent:36pt}.c11{font-style:italic}.c8{font-size:18pt}.c0{font-weight:bold}.c5{background-color:#b6d7a8}.c7{font-size:24pt}.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="c3"><span class="c0 c8">Constexpr Library Additions: chron</span><span class="c8 c0">o, v3</span></p><p class="c1"><span class="c0 c7"></span></p><p class="c3"><span>ISO/IEC JTC1 SC22 WG21 </span><span>N3469</span><span>&nbsp;= 12-0159</span></p><p class="c3"><span>2012-10-18</span></p><p class="c3"><span>Benjamin Kosnik, </span><span class="c2"><a class="c14" href="mailto:bkoz@redhat.com">bkoz@redhat.com</a></span></p><p class="c3"><span>Daniel Krugler, daniel.kruegler@googlemail.com</span></p><p class="c1"><span></span></p><p class="c3"><span class="c0">Addresse</span><span class="c0">s or incorporates:</span><span class="c6 c0">&nbsp;</span><span>LWG 2013, LWG 20</span><span>54, and LWG 2057.</span></p><p class="c3"><span class="c0">Informed by resolution of:</span><span>&nbsp;LWG 2020</span></p><p class="c1"><span></span></p><p class="c1"><span></span></p><p class="c3"><span class="c6 c0">Introduction</span></p><p class="c1"><span class="c8 c0"></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>376</span><span>. It is the first revision of N3</span><span>303</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="c1"><span></span></p><h3 class="c3"><span class="c6 c0">Proposed Changes</span></h3><p class="c1"><span></span></p><p class="c3"><span>In a manner similar to the compile-time API provided via the standard&rsquo;s &lt;ratio&gt; header, the following modifications provide a much larger compile-time interface to &lt;chrono&gt;. These modifications do not include signature changes, and are limited to either the addition of an opportune constexpr keyword or a subtle change to the required sematics to allow a generalized constant expression to be well-formed. </span></p><p class="c1"><span></span></p><p class="c3"><span>There are no ABI changes, and no run-time behavior changes.</span></p><p class="c1"><span></span></p><p class="c3"><span>A list of additional places in 20.11 Time Utilities aka std::chrono 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">&nbsp;</span><span class="c0 c5">in bold and green</span><span>&nbsp;with the older text it is replacing </span><span class="c12">struckto</span><span class="c12">hr</span><span class="c12">ugh in red</span><span>.</span></p><p class="c1"><span></span></p><p class="c3"><span class="c0 c6">Proposed wording</span></p><p class="c1"><span></span></p><p class="c3"><span class="c0">a) Modify 20.11.2 [time.syn]</span><span class="c0">&nbsp;</span><span class="c0">&nbsp;as follows:</span></p><p class="c1"><span class="c0"></span></p><p class="c3"><span class="c4">// 20.11.6.5, time_point arithmetic</span></p><p class="c3"><span class="c4">template &lt;class Clock, class Duration1, class Rep2, class Period2&gt;</span></p><p class="c3"><span class="c4 c0 c5">constexpr</span><span class="c4">&nbsp;time_point&lt;Clock, typename common_type&lt;Duration1, duration&lt;Rep2, Period2&gt;&gt;::type&gt;</span></p><p class="c3"><span class="c4">operator+(const time_point&lt;Clock, Duration1&gt;&amp; lhs, </span></p><p class="c3"><span class="c4">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; const duration&lt;Rep2, Period2&gt;&amp; rhs);</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">template &lt;class Rep1, class Period1, class Clock, class Duration2&gt;</span></p><p class="c3"><span class="c4 c0 c5">constexpr</span><span class="c4">&nbsp;time_point&lt;Clock, typename common_type&lt;duration&lt;Rep1, Period1&gt;, Duration2&gt;::type&gt;</span></p><p class="c3"><span class="c4">operator+(const duration&lt;Rep1, Period1&gt;&amp; lhs, </span></p><p class="c3"><span class="c4">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; const time_point&lt;Clock, Duration2&gt;&amp; rhs);</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">template &lt;class Clock, class Duration1, class Rep2, class Period2&gt;</span></p><p class="c3"><span class="c4 c0 c5">constexpr</span><span class="c4">&nbsp;time_point&lt;Clock, typename common_type&lt;Duration1, duration&lt;Rep2, Period2&gt;&gt;::type&gt;</span></p><p class="c3"><span class="c4">operator-(const time_point&lt;Clock, Duration1&gt;&amp; lhs, </span></p><p class="c3"><span class="c4">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const duration&lt;Rep2, Period2&gt;&amp; rhs);</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c3"><span class="c4 c0 c5">constexpr</span><span class="c4">&nbsp;t</span><span class="c4">ypename common_type&lt;Duration1, Duration2&gt;::type</span></p><p class="c3"><span class="c4">&nbsp; operator-(const time_point&lt;Clock, Duration1&gt;&amp;, </span></p><p class="c3 c10"><span class="c4">&nbsp; &nbsp; &nbsp; const time_point&lt;Clock, Duration2&gt;&amp;);</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">// time_point comparisons</span></p><p class="c3"><span class="c4">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c3"><span class="c4">&nbsp; &nbsp;</span><span class="c4 c0 c5">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c4">bool operator==(const time_point&lt;Clock, Duration1&gt;&amp; lhs, </span></p><p class="c3"><span class="c4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="c4">&nbsp; &nbsp; const time_point&lt;Clock, Duration2&gt;&amp; rhs);</span></p><p class="c3"><span class="c4">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c3"><span class="c4">&nbsp; &nbsp;</span><span class="c4 c0 c5">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c4">bool operator!=(const time_point&lt;Clock, Duration1&gt;&amp; lhs, </span></p><p class="c3"><span class="c4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c4">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="c4">&nbsp;const time_point&lt;Clock, Duration2&gt;&amp; rhs);</span></p><p class="c3"><span class="c4">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c3"><span class="c4">&nbsp; &nbsp;</span><span class="c4 c0 c5">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c4">bool operator&lt; (const time_point&lt;Clock, Duration1&gt;&amp; lhs, </span></p><p class="c3"><span class="c4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c4">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="c4">&nbsp;const time_point&lt;Clock, Duration2&gt;&amp; rhs);</span></p><p class="c3"><span class="c4">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c3"><span class="c4">&nbsp; &nbsp;</span><span class="c4 c0 c5">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c4">bool operator&lt;=(const time_point&lt;Clock, Duration1&gt;&amp; lhs, </span></p><p class="c3"><span class="c4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const time_point&lt;Clock, Duration2&gt;&amp; rhs);</span></p><p class="c3"><span class="c4">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c3"><span class="c4">&nbsp; &nbsp;</span><span class="c4 c0 c5">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c4">bool operator&gt; (const time_point&lt;Clock, Duration1&gt;&amp; lhs, </span></p><p class="c3"><span class="c4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c4">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="c4">const time_point&lt;Clock, Duration2&gt;&amp; rhs);</span></p><p class="c3"><span class="c4">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c3"><span class="c4">&nbsp; &nbsp;</span><span class="c4 c0 c5">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c4">bool operator&gt;=(const time_point&lt;Clock, Duration1&gt;&amp; lhs, </span></p><p class="c3"><span class="c4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const time_point&lt;Clock, Duration2&gt;&amp; rhs);</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">// time_point_cast</span></p><p class="c3"><span class="c4">template &lt;class ToDuration, class Clock, class Duration&gt;</span></p><p class="c3"><span class="c4">&nbsp; </span><span class="c4 c0 c5">constexpr</span><span class="c4">&nbsp;time_point&lt;Clock, ToDuration&gt; </span></p><p class="c3"><span class="c4">&nbsp; time_point_cast(const time_point&lt;Clock, Duration&gt;&amp; t);</span></p><p class="c1"><span></span></p><p class="c3"><span class="c0">b) Add to 20.11.5 [time.duration] &nbsp;after paragraph 6 as follows:</span></p><p class="c1"><span class="c0"></span></p><p class="c3"><span class="c4 c0 c5">Remarks: The defaulted copy constructor of duration shall be a constexpr function if and only if the required initialization of the member rep_ for copy and move, respectively, would satisfy the requirements for a constexpr function.</span></p><p class="c1"><span class="c0"></span></p><p class="c3"><span class="c0">c</span><span class="c0">) Modify 20.11.6 [time.point]</span><span class="c0">&nbsp;</span><span class="c0">as follows:</span></p><p class="c1"><span></span></p><p class="c3"><span class="c4 c0 c5">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c4">time_point();</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4 c0 c5">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c4">explicit</span><span class="c4 c0">&nbsp;</span><span class="c4">time_point(const duration&amp;);</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">template &lt;class Duration2&gt;</span></p><p class="c3"><span class="c4">&nbsp; </span><span class="c4 c0 c5">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c4">time_point(const time_point&lt;clock, Duration2&gt;&amp;);</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4 c0 c5">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c4">duration time_since_epoch() const;</span></p><p class="c1"><span></span></p><p class="c3"><span class="c0">d</span><span class="c0">) Modify 20.11.</span><span class="c0">6.1</span><span class="c0">&nbsp;[time.point.cons]</span><span class="c0">&nbsp;</span><span class="c0">as follows:</span></p><p class="c1"><span class="c0"></span></p><p class="c3"><span class="c4 c0 c5">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c4">time_point();</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4 c0 c5">constexpr explicit</span><span class="c4 c0">&nbsp;</span><span class="c4">time_point(const duration&amp; d);</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">template &lt;class Duration2&gt;</span></p><p class="c3"><span class="c4">&nbsp; </span><span class="c4 c0 c5">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c4">time_point(const time_point&lt;clock, Duration2&gt;&amp; t);</span></p><p class="c1"><span class="c4 c0"></span></p><p class="c3"><span class="c0">e</span><span class="c0">) Modify 20.11.6.2 [time.point.observer] as follows:</span></p><p class="c1"><span class="c0"></span></p><p class="c3"><span class="c4 c0 c5">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c4">duration time_since_epoch() const;</span></p><p class="c1"><span></span></p><p class="c3"><span class="c0">f) Modify 20.11.6.5 [time.point.nonmember] as follows:</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">template &lt;class Clock, class Duration1, class Rep2, class Period2&gt;</span></p><p class="c3"><span class="c4 c0 c5">constexpr</span><span class="c4">&nbsp;time_point&lt;Clock, typename common_type&lt;Duration1, duration&lt;Rep2, Period2&gt;&gt;::type&gt;</span></p><p class="c3"><span class="c4">operator+(const time_point&lt;Clock, Duration1&gt;&amp; lhs, const duration&lt;Rep2, Period2&gt;&amp; rhs);</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">Returns: </span><span class="c4 c9">CT(lhs) += rhs</span><span class="c4">&nbsp;</span><span class="c4 c5">CT(lhs.time_since_epoch() + rhs)</span><span class="c4">&nbsp;where CT is the type of the return value.</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">template &lt;class Rep1, class Period1, class Clock, class Duration2&gt;</span></p><p class="c3"><span class="c4 c0 c5">constexpr</span><span class="c4">&nbsp;time_point&lt;Clock, typename common_type&lt;duration&lt;Rep1, Period1&gt;, Duration2&gt;::type&gt;</span></p><p class="c3"><span class="c4">operator+(const duration&lt;Rep1, Period1&gt;&amp; lhs, const time_point&lt;Clock, Duration2&gt;&amp; rhs);</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">Returns: rhs + lhs.</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">template &lt;class Clock, class Duration1, class Rep2, class Period2&gt;</span></p><p class="c3"><span class="c4 c0 c5">constexpr</span><span class="c4">&nbsp;time_point&lt;Clock, typename common_type&lt;Duration1, duration&lt;Rep2, Period2&gt;&gt;::type&gt;</span></p><p class="c3"><span class="c4">operator-(const time_point&lt;Clock, Duration1&gt;&amp; lhs, const duration&lt;Rep2, Period2&gt;&amp; rhs);</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">Returns: lhs + (-rhs).</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c3"><span class="c4 c0 c5">constexpr</span><span class="c4">&nbsp;typename common_type&lt;Duration1, Duration2&gt;::type</span></p><p class="c3"><span class="c4">operator-(const time_point&lt;Clock, Duration1&gt;&amp; lhs, const time_point&lt;Clock, Duration2&gt;&amp; rhs);</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">Returns: lhs.time_since_epoch() - rhs.time_since_epoch().</span></p><p class="c1"><span class="c0"></span></p><p class="c3"><span class="c0">g) Modify 20.11.6.6 [time.point.comparisons] as follows:</span></p><p class="c1"><span class="c0"></span></p><p class="c3"><span class="c4">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c3"><span class="c4 c0 c5">constexpr</span><span class="c4">&nbsp;bool operator==(const time_point&lt;Clock, Duration1&gt;&amp; lhs, const time_point&lt;Clock, Duration2&gt;&amp; rhs);</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">Returns: lhs.time_since_epoch() == rhs.time_since_epoch().</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c3"><span class="c4 c0 c5">constexpr</span><span class="c4">&nbsp;bool operator!=(const time_point&lt;Clock, Duration1&gt;&amp; lhs, const time_point&lt;Clock, Duration2&gt;&amp; rhs);</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">Returns: !(lhs == rhs).</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c3"><span class="c4 c0 c5">constexpr</span><span class="c4">&nbsp;bool operator&lt;(const time_point&lt;Clock, Duration1&gt;&amp; lhs, const time_point&lt;Clock, Duration2&gt;&amp; rhs);</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">Returns: lhs.time_since_epoch() &lt; rhs.time_since_epoch().</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c3"><span class="c4 c0 c5">constexpr</span><span class="c4">&nbsp;bool operator&lt;=(const time_point&lt;Clock, Duration1&gt;&amp; lhs, const time_point&lt;Clock, Duration2&gt;&amp; rhs);</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">Returns: !(rhs &lt; lhs).</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c3"><span class="c4">&nbsp;</span><span class="c4 c0 c5">constexpr</span><span class="c4">&nbsp;bool operator&gt;(const time_point&lt;Clock, Duration1&gt;&amp; lhs, const time_point&lt;Clock, Duration2&gt;&amp; rhs);</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">Returns: rhs &lt; lhs.</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c3"><span class="c4 c0 c5">constexpr</span><span class="c4">&nbsp;bool operator&gt;=(const time_point&lt;Clock, Duration1&gt;&amp; lhs, const time_point&lt;Clock, Duration2&gt;&amp; rhs);</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">Returns: !(lhs &lt; rhs).</span></p><p class="c1"><span class="c0"></span></p><p class="c3"><span class="c0">h) Modify 20.11.6.7 [time.point.cast] as follows:</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">template &lt;class ToDuration, class Clock, class Duration&gt;</span></p><p class="c3"><span class="c4">&nbsp; </span><span class="c4 c0 c5">constexpr</span><span class="c4">&nbsp;time_point&lt;Clock, ToDuration&gt; </span></p><p class="c3"><span class="c4">&nbsp; time_point_cast(const time_point&lt;Clock, Duration&gt;&amp; t);</span></p><p class="c1"><span class="c4"></span></p><p class="c3"><span class="c4">Remarks: This function shall not participate in overload resolution unless ToDuration is an instanti-</span></p><p class="c3"><span class="c4">&nbsp;ation of duration.</span></p><p class="c3"><span class="c4">Returns: time_point&lt;Clock, ToDuration&gt;(duration_cast&lt;ToDuration&gt;(t.time_since_epoch())).</span></p><p class="c1"><span class="c0"></span></p><p class="c3"><span class="c0">i) Modify 20.11.7.1 [time.clock.system] as follows:</span></p><p class="c1"><span></span></p><p class="c3"><span class="c4">static </span><span class="c9 c4">const</span><span class="c4">&nbsp;</span><span class="c4 c0 c5">constexpr</span><span class="c4">&nbsp;bool is_steady = unspecified;</span></p><p class="c1"><span></span></p><p class="c3"><span class="c0">j</span><span class="c0">) Modify 20.11.</span><span class="c0">7</span><span class="c0">.2 [time.clock.steady]</span><span class="c0">&nbsp;</span><span class="c0">as follows:</span></p><p class="c1"><span class="c0"></span></p><p class="c3"><span class="c4">static </span><span class="c9 c4">const</span><span class="c4">&nbsp;</span><span class="c4 c0 c5">constexpr</span><span class="c4">&nbsp;bool is_steady = </span><span class="c4">true</span><span class="c4">;</span></p><p class="c1"><span></span></p><p class="c3"><span class="c0">k</span><span class="c0">) Modify 20.11.</span><span class="c0">7</span><span class="c0">.3 [time.clock.hires] as follows:</span></p><p class="c1"><span class="c0"></span></p><p class="c3"><span class="c4">static </span><span class="c9 c4">const</span><span class="c4">&nbsp;</span><span class="c4 c0 c5">constexpr</span><span class="c4">&nbsp;bool is_steady = unspecified;</span></p><p class="c3"><span>&nbsp;</span></p><p class="c1"><span></span></p><p class="c3"><span class="c6 c0">Acknowledgments</span></p><p class="c1"><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>