<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 3180: Inconsistently named return type for ranges::minmax_element</title>
<meta property="og:title" content="Issue 3180: Inconsistently named return type for ranges::minmax_element">
<meta property="og:description" content="C++ library issue. Status: C++20">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue3180.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="3180"><a href="lwg-defects.html#3180">3180</a>. Inconsistently named return type for <code>ranges::minmax_element</code></h3>
<p><b>Section:</b> 26.4 <a href="https://wg21.link/algorithm.syn">[algorithm.syn]</a> <b>Status:</b> <a href="lwg-active.html#C++20">C++20</a>
 <b>Submitter:</b> Casey Carter <b>Opened:</b> 2018-12-21 <b>Last modified:</b> 2021-02-25</p>
<p><b>Priority: </b>0
</p>
<p><b>View other</b> <a href="lwg-index-open.html#algorithm.syn">active issues</a> in [algorithm.syn].</p>
<p><b>View all other</b> <a href="lwg-index.html#algorithm.syn">issues</a> in [algorithm.syn].</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>
The overloads of <code>std::ranges::minmax_element</code> are specified to return
<code>std::ranges::minmax_result</code>, which is inconsistent with the intended
design. When an algorithm <code>foo</code> returns an aggregate of multiple results,
the return type should be named <code>foo_result</code>.
The spec should introduce an alias <code>minmax_element_result</code> for
<code>minmax_result</code> and use that alias as the return type of the
<code>std::ranges::minmax_element</code> overloads.
</p>

<p><i>[2019-01-11 Status to Tentatively Ready after five positive votes on the reflector.]</i></p>

<p>
During that reflector discussion several contributers questioned the choice of alias templates to denote
algorithm result types or particular aspects of it. Since this approach had been approved by LEWG before, 
it was suggested to those opponents to instead write a paper, because changing this as part of this issue 
would be a design change that would require a more global fixing approach.
</p>



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

<ol>
<li><p>Change 26.4 <a href="https://wg21.link/algorithm.syn">[algorithm.syn]</a> as indicated, and adjust the
declarations of <code>std::ranges::minmax_element</code>
in 26.8.9 <a href="https://wg21.link/alg.min.max">[alg.min.max]</a> to agree:</p>
<blockquote>
<pre>
[&hellip;]
template&lt;class ExecutionPolicy, class ForwardIterator, class Compare&gt;
  pair&lt;ForwardIterator, ForwardIterator&gt;
    minmax_element(ExecutionPolicy&amp;&amp; exec, // see 26.3.5 <a href="https://wg21.link/algorithms.parallel.overloads">[algorithms.parallel.overloads]</a>
                   ForwardIterator first, ForwardIterator last, Compare comp);

namespace ranges {
  <ins>template&lt;class I&gt;</ins>
  <ins>using minmax_element_result = minmax_result&lt;I&gt;;</ins>

  template&lt;ForwardIterator I, Sentinel&lt;I&gt; S, class Proj = identity,
           IndirectStrictWeakOrder&lt;projected&lt;I, Proj&gt;&gt; Comp = ranges::less&lt;&gt;&gt;
    constexpr minmax_<ins>element_</ins>result&lt;I&gt;
      minmax_element(I first, S last, Comp comp = {}, Proj proj = {});
  template&lt;ForwardRange R, class Proj = identity,
           IndirectStrictWeakOrder&lt;projected&lt;iterator_t&lt;R&gt;, Proj&gt;&gt; Comp = ranges::less&lt;&gt;&gt;
    constexpr minmax_<ins>element_</ins>result&lt;safe_iterator_t&lt;R&gt;&gt;
      minmax_element(R&amp;&amp; r, Comp comp = {}, Proj proj = {});
}

// 26.8.10 <a href="https://wg21.link/alg.clamp">[alg.clamp]</a>, bounded value
[&hellip;]
</pre>
</blockquote>
</li>
</ol>





</body>
</html>
