<html><head><title>Constexpr Library Additions v2: chrono</title><style type="text/css">ol{margin:0;padding:0}p{margin:0}.c14{width:468pt;background-color:#ffffff;padding:72pt 72pt 72pt 72pt}.c10{color:#000099;text-decoration:underline}.c15{color:inherit;text-decoration:inherit}.c9{background-color:#e06666;text-decoration:line-through}.c3{background-color:#b6d7a8;font-weight:bold}.c11{background-color:#ea9999;text-decoration:line-through}.c4{font-weight:bold}.c6{font-size:24pt}.c7{font-size:14pt}.c13{background-color:#b6d7a8}.c8{text-indent:36pt}.c5{font-size:18pt}.c0{font-size:9pt}.c2{height:11pt}.c1{direction:ltr}.c12{font-style:italic}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="c14"><p class="c1"><span class="c4 c5">Constexpr Library Additions: chron</span><span class="c4 c5">o, v2</span></p><p class="c2 c1"><span class="c4 c6"></span></p><p class="c1"><span>ISO/IEC JTC1 SC22 WG21 </span><span>N3303</span><span>&nbsp;= 1</span><span>1-0073</span><span>&nbsp;- 201</span><span>1-08-20</span></p><p class="c1"><span>Benjamin Kosnik, </span><span class="c10"><a class="c15" 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="c4">Addresse</span><span class="c4">s or incorporates:</span><span class="c4 c7">&nbsp;</span><span>LWG 2013, LWG 20</span><span>54, and LWG 2057.</span></p><p class="c1"><span class="c4">Informed by resolution of:</span><span>&nbsp;LWG 2020</span></p><p class="c1 c2"><span></span></p><p class="c2 c1"><span></span></p><p class="c1"><span class="c4 c7">Introduction</span></p><p class="c2 c1"><span class="c4 c5"></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>291</span><span>. It is the first revision of N3229. 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="c4 c7">Proposed Changes</span></h3><p class="c2 c1"><span></span></p><p class="c1"><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="c2 c1"><span></span></p><p class="c1"><span>There are no ABI changes, and no run-time behavior changes.</span></p><p class="c2 c1"><span></span></p><p class="c1"><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="c4 c12">&nbsp;</span><span class="c3">in bold and green</span><span>&nbsp;with the older text it is replacing </span><span class="c11">struckthrough in red</span><span>.</span></p><p class="c1"><span class="c4 c7">Proposed wording</span></p><p class="c2 c1"><span></span></p><p class="c1"><span class="c4">a) Modify 20.11.2 [time.syn]</span><span class="c4">&nbsp;</span><span class="c4">&nbsp;as follows:</span></p><p class="c2 c1"><span class="c4"></span></p><p class="c1"><span class="c0">// 20.11.6.5, time_point arithmetic</span></p><p class="c1"><span class="c0">template &lt;class Clock, class Duration1, class Rep2, class Period2&gt;</span></p><p class="c1"><span class="c3 c0">constexpr</span><span class="c0">&nbsp;time_point&lt;Clock, typename common_type&lt;Duration1, duration&lt;Rep2, Period2&gt;&gt;::type&gt;</span></p><p class="c1"><span class="c0">operator+(const time_point&lt;Clock, Duration1&gt;&amp; lhs, </span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; const duration&lt;Rep2, Period2&gt;&amp; rhs);</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">template &lt;class Rep1, class Period1, class Clock, class Duration2&gt;</span></p><p class="c1"><span class="c3 c0">constexpr</span><span class="c0">&nbsp;time_point&lt;Clock, typename common_type&lt;duration&lt;Rep1, Period1&gt;, Duration2&gt;::type&gt;</span></p><p class="c1"><span class="c0">operator+(const duration&lt;Rep1, Period1&gt;&amp; lhs, </span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; const time_point&lt;Clock, Duration2&gt;&amp; rhs);</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">template &lt;class Clock, class Duration1, class Rep2, class Period2&gt;</span></p><p class="c1"><span class="c3 c0">constexpr</span><span class="c0">&nbsp;time_point&lt;Clock, typename common_type&lt;Duration1, duration&lt;Rep2, Period2&gt;&gt;::type&gt;</span></p><p class="c1"><span class="c0">operator-(const time_point&lt;Clock, Duration1&gt;&amp; lhs, </span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const duration&lt;Rep2, Period2&gt;&amp; rhs);</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c1"><span class="c3 c0">constexpr</span><span class="c0">&nbsp;t</span><span class="c0">ypename common_type&lt;Duration1, Duration2&gt;::type</span></p><p class="c1"><span class="c0">&nbsp; operator-(const time_point&lt;Clock, Duration1&gt;&amp;, </span></p><p class="c1 c8"><span class="c0">&nbsp; &nbsp; &nbsp; const time_point&lt;Clock, Duration2&gt;&amp;);</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">// time_point comparisons</span></p><p class="c1"><span class="c0">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;</span><span class="c3 c0">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c0">bool operator==(const time_point&lt;Clock, Duration1&gt;&amp; lhs, </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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="c0">&nbsp; &nbsp; const time_point&lt;Clock, Duration2&gt;&amp; rhs);</span></p><p class="c1"><span class="c0">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;</span><span class="c3 c0">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c0">bool operator!=(const time_point&lt;Clock, Duration1&gt;&amp; lhs, </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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c0">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="c0">&nbsp;const time_point&lt;Clock, Duration2&gt;&amp; rhs);</span></p><p class="c1"><span class="c0">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;</span><span class="c3 c0">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c0">bool operator&lt; (const time_point&lt;Clock, Duration1&gt;&amp; lhs, </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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c0">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="c0">&nbsp;const time_point&lt;Clock, Duration2&gt;&amp; rhs);</span></p><p class="c1"><span class="c0">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;</span><span class="c3 c0">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c0">bool operator&lt;=(const time_point&lt;Clock, Duration1&gt;&amp; lhs, </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;&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="c0">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;</span><span class="c3 c0">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c0">bool operator&gt; (const time_point&lt;Clock, Duration1&gt;&amp; lhs, </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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="c0">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="c0">const time_point&lt;Clock, Duration2&gt;&amp; rhs);</span></p><p class="c1"><span class="c0">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;</span><span class="c3 c0">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c0">bool operator&gt;=(const time_point&lt;Clock, Duration1&gt;&amp; lhs, </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;&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="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">// time_point_cast</span></p><p class="c1"><span class="c0">template &lt;class ToDuration, class Clock, class Duration&gt;</span></p><p class="c1"><span class="c0">&nbsp; </span><span class="c3 c0">constexpr</span><span class="c0">&nbsp;time_point&lt;Clock, ToDuration&gt; </span></p><p class="c1"><span class="c0">&nbsp; time_point_cast(const time_point&lt;Clock, Duration&gt;&amp; t);</span></p><p class="c2 c1"><span></span></p><p class="c1"><span class="c4">b) Modify 20.11.5 [time.duration] as follows:</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">constexpr duration() </span><span class="c0 c11">= default</span><span class="c0">;</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c3 c0">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c0">duration(const duration&amp;) = default;</span></p><p class="c2 c1"><span></span></p><p class="c1"><span class="c4">c</span><span class="c4">) Modify 20.11.5.1 </span><span class="c4">[time.duration.cons] </span><span class="c4">&nbsp;as follows:</span></p><p class="c2 c1"><span></span></p><p class="c1"><span class="c0">constexpr duration();</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">Effects: Constructs an object of type duration, </span><span class="c0">value initializing</span><span class="c0">&nbsp;rep_.</span></p><p class="c1"><span class="c0">Note: [Scalars do not have constexpr default constructors. This is problematic when used as member data for duration, as constexpr defaulted constructors are only well formed for classes where all member data have constexpr default constructors.]</span></p><p class="c2 c1"><span></span></p><p class="c1"><span class="c4">d) Modify 20.11.6 [time.point]</span><span class="c4">&nbsp;</span><span class="c4">as follows:</span></p><p class="c2 c1"><span></span></p><p class="c1"><span class="c3 c0">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c0">time_point();</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c3 c0">constexpr explicit</span><span class="c4 c0">&nbsp;</span><span class="c0">time_point(const duration&amp;);</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">template &lt;class Duration2&gt;</span></p><p class="c1"><span class="c0">&nbsp; </span><span class="c3 c0">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c0">time_point(const time_point&lt;clock, Duration2&gt;&amp;);</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c3 c0">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c0">duration time_since_epoch() const;</span></p><p class="c2 c1"><span></span></p><p class="c1"><span class="c4">e) Modify 20.11.</span><span class="c4">6.1</span><span class="c4">&nbsp;[time.point.cons]</span><span class="c4">&nbsp;</span><span class="c4">as follows:</span></p><p class="c2 c1"><span class="c4"></span></p><p class="c1"><span class="c0 c3">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c0">time_point();</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c3 c0">constexpr explicit</span><span class="c4 c0">&nbsp;</span><span class="c0">time_point(const duration&amp; d);</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">template &lt;class Duration2&gt;</span></p><p class="c1"><span class="c0">&nbsp; </span><span class="c3 c0">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c0">time_point(const time_point&lt;clock, Duration2&gt;&amp; t);</span></p><p class="c2 c1"><span class="c4 c0"></span></p><p class="c1"><span class="c4">f) Modify 20.11.6.2 [time.point.observer] as follows:</span></p><p class="c2 c1"><span class="c4"></span></p><p class="c1"><span class="c3 c0">constexpr</span><span class="c4 c0">&nbsp;</span><span class="c0">duration time_since_epoch() const;</span></p><p class="c2 c1"><span></span></p><p class="c1"><span class="c4">g) Modify 20.11.6.5 [time.point.nonmember] as follows:</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">template &lt;class Clock, class Duration1, class Rep2, class Period2&gt;</span></p><p class="c1"><span class="c3 c0">constexpr</span><span class="c0">&nbsp;time_point&lt;Clock, typename common_type&lt;Duration1, duration&lt;Rep2, Period2&gt;&gt;::type&gt;</span></p><p class="c1"><span class="c0">operator+(const time_point&lt;Clock, Duration1&gt;&amp; lhs, const duration&lt;Rep2, Period2&gt;&amp; rhs);</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">Returns: </span><span class="c9 c0">CT(lhs) += rhs</span><span class="c0">&nbsp;</span><span class="c0 c13">CT(lhs.time_since_epoch() + rhs)</span><span class="c0">&nbsp;where CT is the type of the return value.</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">template &lt;class Rep1, class Period1, class Clock, class Duration2&gt;</span></p><p class="c1"><span class="c3 c0">constexpr</span><span class="c0">&nbsp;time_point&lt;Clock, typename common_type&lt;duration&lt;Rep1, Period1&gt;, Duration2&gt;::type&gt;</span></p><p class="c1"><span class="c0">operator+(const duration&lt;Rep1, Period1&gt;&amp; lhs, const time_point&lt;Clock, Duration2&gt;&amp; rhs);</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">Returns: rhs + lhs.</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">template &lt;class Clock, class Duration1, class Rep2, class Period2&gt;</span></p><p class="c1"><span class="c3 c0">constexpr</span><span class="c0">&nbsp;time_point&lt;Clock, typename common_type&lt;Duration1, duration&lt;Rep2, Period2&gt;&gt;::type&gt;</span></p><p class="c1"><span class="c0">operator-(const time_point&lt;Clock, Duration1&gt;&amp; lhs, const duration&lt;Rep2, Period2&gt;&amp; rhs);</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">Returns: lhs + (-rhs).</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c1"><span class="c3 c0">constexpr</span><span class="c0">&nbsp;typename common_type&lt;Duration1, Duration2&gt;::type</span></p><p class="c1"><span class="c0">operator-(const time_point&lt;Clock, Duration1&gt;&amp; lhs, const time_point&lt;Clock, Duration2&gt;&amp; rhs);</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">Returns: lhs.time_since_epoch() - rhs.time_since_epoch().</span></p><p class="c2 c1"><span class="c4"></span></p><p class="c1"><span class="c4">h) Modify 20.11.6.6 [time.point.comparisons] as follows:</span></p><p class="c2 c1"><span class="c4"></span></p><p class="c1"><span class="c0">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c1"><span class="c3 c0">constexpr</span><span class="c0">&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="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">Returns: lhs.time_since_epoch() == rhs.time_since_epoch().</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c1"><span class="c3 c0">constexpr</span><span class="c0">&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="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">Returns: !(lhs == rhs).</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c1"><span class="c3 c0">constexpr</span><span class="c0">&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="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">Returns: lhs.time_since_epoch() &lt; rhs.time_since_epoch().</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c1"><span class="c3 c0">constexpr</span><span class="c0">&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="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">Returns: !(rhs &lt; lhs).</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c1"><span class="c0">&nbsp;</span><span class="c3 c0">constexpr</span><span class="c0">&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="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">Returns: rhs &lt; lhs.</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">template &lt;class Clock, class Duration1, class Duration2&gt;</span></p><p class="c1"><span class="c3 c0">constexpr</span><span class="c0">&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="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">Returns: !(lhs &lt; rhs).</span></p><p class="c2 c1"><span class="c4"></span></p><p class="c1"><span class="c4">i) Modify 20.11.6.7 [time.point.cast] as follows:</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">template &lt;class ToDuration, class Clock, class Duration&gt;</span></p><p class="c1"><span class="c0">&nbsp; </span><span class="c3 c0">constexpr</span><span class="c0">&nbsp;time_point&lt;Clock, ToDuration&gt; </span></p><p class="c1"><span class="c0">&nbsp; time_point_cast(const time_point&lt;Clock, Duration&gt;&amp; t);</span></p><p class="c2 c1"><span class="c0"></span></p><p class="c1"><span class="c0">Remarks: This function shall not participate in overload resolution unless ToDuration is an instanti-</span></p><p class="c1"><span class="c0">&nbsp;ation of duration.</span></p><p class="c1"><span class="c0">Returns: time_point&lt;Clock, ToDuration&gt;(duration_cast&lt;ToDuration&gt;(t.time_since_epoch())).</span></p><p class="c2 c1"><span class="c4"></span></p><p class="c1"><span class="c4">j) Modify 20.11.7.1 [time.clock.system] as follows:</span></p><p class="c2 c1"><span></span></p><p class="c1"><span class="c0">static </span><span class="c0 c9">const</span><span class="c0">&nbsp;</span><span class="c3 c0">constexpr</span><span class="c0">&nbsp;bool is_steady = unspecified;</span></p><p class="c2 c1"><span></span></p><p class="c1"><span class="c4">k</span><span class="c4">) Modify 20.11.</span><span class="c4">7</span><span class="c4">.2 [time.clock.steady]</span><span class="c4">&nbsp;</span><span class="c4">as follows:</span></p><p class="c2 c1"><span class="c4"></span></p><p class="c1"><span class="c0">static </span><span class="c9 c0">const</span><span class="c0">&nbsp;</span><span class="c3 c0">constexpr</span><span class="c0">&nbsp;bool is_steady = unspecified;</span></p><p class="c2 c1"><span></span></p><p class="c1"><span class="c4">l</span><span class="c4">) Modify 20.11.</span><span class="c4">7</span><span class="c4">.3 [time.clock.hires] as follows:</span></p><p class="c2 c1"><span class="c4"></span></p><p class="c1"><span class="c0">static </span><span class="c9 c0">const</span><span class="c0">&nbsp;</span><span class="c3 c0">constexpr</span><span class="c0">&nbsp;bool is_steady = unspecified;</span></p><p class="c1"><span>&nbsp;</span></p><p class="c2 c1"><span></span></p><p class="c1"><span class="c4 c7">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>