<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 2945: Order of template parameters in optional comparisons</title>
<meta property="og:title" content="Issue 2945: Order of template parameters in optional comparisons">
<meta property="og:description" content="C++ library issue. Status: C++20">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue2945.html">
<meta property="og:type" content="website">
<meta property="og:image" content="http://cplusplus.github.io/LWG/images/cpp_logo.png">
<meta property="og:image:alt" content="C++ logo">
<style>
  p {text-align:justify}
  li {text-align:justify}
  pre code.backtick::before { content: "`" }
  pre code.backtick::after { content: "`" }
  blockquote.note
  {
    background-color:#E0E0E0;
    padding-left: 15px;
    padding-right: 15px;
    padding-top: 1px;
    padding-bottom: 1px;
  }
  ins {background-color:#A0FFA0}
  del {background-color:#FFA0A0}
  table.issues-index { border: 1px solid; border-collapse: collapse; }
  table.issues-index th { text-align: center; padding: 4px; border: 1px solid; }
  table.issues-index td { padding: 4px; border: 1px solid; }
  table.issues-index td:nth-child(1) { text-align: right; }
  table.issues-index td:nth-child(2) { text-align: left; }
  table.issues-index td:nth-child(3) { text-align: left; }
  table.issues-index td:nth-child(4) { text-align: left; }
  table.issues-index td:nth-child(5) { text-align: center; }
  table.issues-index td:nth-child(6) { text-align: center; }
  table.issues-index td:nth-child(7) { text-align: left; }
  table.issues-index td:nth-child(5) span.no-pr { color: red; }
  @media (prefers-color-scheme: dark) {
     html {
        color: #ddd;
        background-color: black;
     }
     ins {
        background-color: #225522
     }
     del {
        background-color: #662222
     }
     a {
        color: #6af
     }
     a:visited {
        color: #6af
     }
     blockquote.note
     {
        background-color: rgba(255, 255, 255, .10)
     }
  }
</style>
</head>
<body>
<hr>
<p><em>This page is a snapshot from the LWG issues list, see the <a href="lwg-active.html">Library Active Issues List</a> for more information and the meaning of <a href="lwg-active.html#C++20">C++20</a> status.</em></p>
<h3 id="2945"><a href="lwg-defects.html#2945">2945</a>. Order of template parameters in <code>optional</code> comparisons</h3>
<p><b>Section:</b> 22.5.9 <a href="https://wg21.link/optional.comp.with.t">[optional.comp.with.t]</a> <b>Status:</b> <a href="lwg-active.html#C++20">C++20</a>
 <b>Submitter:</b> Jonathan Wakely <b>Opened:</b> 2017-03-13 <b>Last modified:</b> 2021-06-06</p>
<p><b>Priority: </b>2
</p>
<p><b>View all other</b> <a href="lwg-index.html#optional.comp.with.t">issues</a> in [optional.comp.with.t].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#C++20">C++20</a> status.</p>
<p><b>Discussion:</b></p>
<p>
LWG <a href="lwg-defects.html#2934" title="optional&lt;const T&gt; doesn't compare with T (Status: C++17)">2934</a><sup><a href="https://cplusplus.github.io/LWG/issue2934" title="Latest snapshot">(i)</a></sup> added an additional template parameter to the comparison
operators for <code>std::optional</code>, but the ones that compare <code>U</code> with
<code>optional&lt;T&gt;</code> have the parameters backwards compared to the function parameters:
</p>

<blockquote>
<pre>
template &lt;class T, class U&gt;
constexpr bool operator==(const U&amp;, const optional&lt;T&gt;&amp;);
</pre>
</blockquote>

<p>
Ville confirmed there's no particular reason for this, it's just how
he wrote the proposed resolution, but as this has normative effect we
should consider if we really want the template parameters and function
parameters to be in different orders or not.
</p>

<p><i>[2017-07-13, Casey Carter provides wording]</i></p>


<p><i>[2016-07, Toronto Thursday night issues processing]</i></p>

<p>Status to Ready</p>


<p id="res-2945"><b>Proposed resolution:</b></p>
<p>
This wording is relative to <a href="https://wg21.link/n4659">N4659</a>.
</p>

<ol>
<li>
<p>
Modify 22.5.2 <a href="https://wg21.link/optional.syn">[optional.syn]</a>, <code>&lt;optional&gt;</code> synopsis, as indicated:
</p>
<blockquote>
<pre>
<i>//  [optional.comp_with_t], comparison with</i> T
template &lt;class T, class U&gt; constexpr bool operator==(const optional&lt;T&gt;&amp;, const U&amp;);
template &lt;class T, class U&gt; constexpr bool operator==(const <del>U</del><ins>T</ins>&amp;, const optional&lt;<del>T</del><ins>U</ins>&gt;&amp;);
template &lt;class T, class U&gt; constexpr bool operator!=(const optional&lt;T&gt;&amp;, const U&amp;);
template &lt;class T, class U&gt; constexpr bool operator!=(const <del>U</del><ins>T</ins>&amp;, const optional&lt;<del>T</del><ins>U</ins>&gt;&amp;);
template &lt;class T, class U&gt; constexpr bool operator&lt;(const optional&lt;T&gt;&amp;, const U&amp;);
template &lt;class T, class U&gt; constexpr bool operator&lt;(const <del>U</del><ins>T</ins>&amp;, const optional&lt;<del>T</del><ins>U</ins>&gt;&amp;);
template &lt;class T, class U&gt; constexpr bool operator&lt;=(const optional&lt;T&gt;&amp;, const U&amp;);
template &lt;class T, class U&gt; constexpr bool operator&lt;=(const <del>U</del><ins>T</ins>&amp;, const optional&lt;<del>T</del><ins>U</ins>&gt;&amp;);
template &lt;class T, class U&gt; constexpr bool operator&gt;(const optional&lt;T&gt;&amp;, const U&amp;);
template &lt;class T, class U&gt; constexpr bool operator&gt;(const <del>U</del><ins>T</ins>&amp;, const optional&lt;<del>T</del><ins>U</ins>&gt;&amp;);
template &lt;class T, class U&gt; constexpr bool operator&gt;=(const optional&lt;T&gt;&amp;, const U&amp;);
template &lt;class T, class U&gt; constexpr bool operator&gt;=(const <del>U</del><ins>T</ins>&amp;, const optional&lt;<del>T</del><ins>U</ins>&gt;&amp;);
</pre>
</blockquote>
</li>

<li>
<p>
Modify  [optional.comp_with_t] as indicated:
</p>
<blockquote>
<pre>
template &lt;class T, class U&gt; constexpr bool operator==(const <del>U</del><ins>T</ins>&amp; v, const optional&lt;<del>T</del><ins>U</ins>&gt;&amp; x);
</pre>
<blockquote>
<p>
-3- [&hellip;]
</p>
</blockquote>
<p>
[&hellip;]
</p>
<pre>
template &lt;class T, class U&gt; constexpr bool operator!=(const <del>U</del><ins>T</ins>&amp; v, const optional&lt;<del>T</del><ins>U</ins>&gt;&amp; x);
</pre>
<blockquote>
<p>
-7- [&hellip;]
</p>
</blockquote>
<p>
[&hellip;]
</p>
<pre>
template &lt;class T, class U&gt; constexpr bool operator&lt;(const <del>U</del><ins>T</ins>&amp; v, const optional&lt;<del>T</del><ins>U</ins>&gt;&amp; x);
</pre>
<blockquote>
<p>
-11- [&hellip;]
</p>
</blockquote>
<p>
[&hellip;]
</p>
<pre>
template &lt;class T, class U&gt; constexpr bool operator&lt;=(const <del>U</del><ins>T</ins>&amp; v, const optional&lt;<del>T</del><ins>U</ins>&gt;&amp; x);
</pre>
<blockquote>
<p>
-15- [&hellip;]
</p>
</blockquote>
<p>
[&hellip;]
</p>
<pre>
template &lt;class T, class U&gt; constexpr bool operator&gt;(const <del>U</del><ins>T</ins>&amp; v, const optional&lt;<del>T</del><ins>U</ins>&gt;&amp; x);
</pre>
<blockquote>
<p>
-19- [&hellip;]
</p>
</blockquote>
<p>
[&hellip;]
</p>
<pre>
template &lt;class T, class U&gt; constexpr bool operator&gt;=(const <del>U</del><ins>T</ins>&amp; v, const optional&lt;<del>T</del><ins>U</ins>&gt;&amp; x);
</pre>
<blockquote>
<p>
-23- [&hellip;]
</p>
</blockquote>
<p>
[&hellip;]
</p>
</blockquote>
</li>
</ol>





</body>
</html>
