<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang xml:lang>
<head>
  <meta charset="utf-8" />
  <meta name="generator" content="mpark/wg21" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
  <meta name="dcterms.date" content="2021-05-11" />
  <title>\[\[nodiscard\]\] in the Standard Library: Clause 23 Iterators library</title>
  <style>
      code{white-space: pre-wrap;}
      span.smallcaps{font-variant: small-caps;}
      span.underline{text-decoration: underline;}
      div.column{display: inline-block; vertical-align: top; width: 50%;}
      div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
      ul.task-list{list-style: none;}
      pre > code.sourceCode { white-space: pre; position: relative; }
      pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
      pre > code.sourceCode > span:empty { height: 1.2em; }
      code.sourceCode > span { color: inherit; text-decoration: inherit; }
      div.sourceCode { margin: 1em 0; }
      pre.sourceCode { margin: 0; }
      @media screen {
      div.sourceCode { overflow: auto; }
      }
      @media print {
      pre > code.sourceCode { white-space: pre-wrap; }
      pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
      }
      pre.numberSource code
        { counter-reset: source-line 0; }
      pre.numberSource code > span
        { position: relative; left: -4em; counter-increment: source-line; }
      pre.numberSource code > span > a:first-child::before
        { content: counter(source-line);
          position: relative; left: -1em; text-align: right; vertical-align: baseline;
          border: none; display: inline-block;
          -webkit-touch-callout: none; -webkit-user-select: none;
          -khtml-user-select: none; -moz-user-select: none;
          -ms-user-select: none; user-select: none;
          padding: 0 4px; width: 4em;
          color: #aaaaaa;
        }
      pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
      div.sourceCode
        {  background-color: #f6f8fa; }
      @media screen {
      pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
      }
      code span. { } /* Normal */
      code span.al { color: #ff0000; } /* Alert */
      code span.an { } /* Annotation */
      code span.at { } /* Attribute */
      code span.bn { color: #9f6807; } /* BaseN */
      code span.bu { color: #9f6807; } /* BuiltIn */
      code span.cf { color: #00607c; } /* ControlFlow */
      code span.ch { color: #9f6807; } /* Char */
      code span.cn { } /* Constant */
      code span.co { color: #008000; font-style: italic; } /* Comment */
      code span.cv { color: #008000; font-style: italic; } /* CommentVar */
      code span.do { color: #008000; } /* Documentation */
      code span.dt { color: #00607c; } /* DataType */
      code span.dv { color: #9f6807; } /* DecVal */
      code span.er { color: #ff0000; font-weight: bold; } /* Error */
      code span.ex { } /* Extension */
      code span.fl { color: #9f6807; } /* Float */
      code span.fu { } /* Function */
      code span.im { } /* Import */
      code span.in { color: #008000; } /* Information */
      code span.kw { color: #00607c; } /* Keyword */
      code span.op { color: #af1915; } /* Operator */
      code span.ot { } /* Other */
      code span.pp { color: #6f4e37; } /* Preprocessor */
      code span.re { } /* RegionMarker */
      code span.sc { color: #9f6807; } /* SpecialChar */
      code span.ss { color: #9f6807; } /* SpecialString */
      code span.st { color: #9f6807; } /* String */
      code span.va { } /* Variable */
      code span.vs { color: #9f6807; } /* VerbatimString */
      code span.wa { color: #008000; font-weight: bold; } /* Warning */
      code.diff {color: #898887}
      code.diff span.va {color: #006e28}
      code.diff span.st {color: #bf0303}
  </style>
  <style type="text/css">
body {
margin: 5em;
font-family: serif;

hyphens: auto;
line-height: 1.35;
}
div.wrapper {
max-width: 60em;
margin: auto;
}
ul {
list-style-type: none;
padding-left: 2em;
margin-top: -0.2em;
margin-bottom: -0.2em;
}
a {
text-decoration: none;
color: #4183C4;
}
a.hidden_link {
text-decoration: none;
color: inherit;
}
li {
margin-top: 0.6em;
margin-bottom: 0.6em;
}
h1, h2, h3, h4 {
position: relative;
line-height: 1;
}
a.self-link {
position: absolute;
top: 0;
left: calc(-1 * (3.5rem - 26px));
width: calc(3.5rem - 26px);
height: 2em;
text-align: center;
border: none;
transition: opacity .2s;
opacity: .5;
font-family: sans-serif;
font-weight: normal;
font-size: 83%;
}
a.self-link:hover { opacity: 1; }
a.self-link::before { content: "§"; }
ul > li:before {
content: "\2014";
position: absolute;
margin-left: -1.5em;
}
:target { background-color: #C9FBC9; }
:target .codeblock { background-color: #C9FBC9; }
:target ul { background-color: #C9FBC9; }
.abbr_ref { float: right; }
.folded_abbr_ref { float: right; }
:target .folded_abbr_ref { display: none; }
:target .unfolded_abbr_ref { float: right; display: inherit; }
.unfolded_abbr_ref { display: none; }
.secnum { display: inline-block; min-width: 35pt; }
.header-section-number { display: inline-block; min-width: 35pt; }
.annexnum { display: block; }
div.sourceLinkParent {
float: right;
}
a.sourceLink {
position: absolute;
opacity: 0;
margin-left: 10pt;
}
a.sourceLink:hover {
opacity: 1;
}
a.itemDeclLink {
position: absolute;
font-size: 75%;
text-align: right;
width: 5em;
opacity: 0;
}
a.itemDeclLink:hover { opacity: 1; }
span.marginalizedparent {
position: relative;
left: -5em;
}
li span.marginalizedparent { left: -7em; }
li ul > li span.marginalizedparent { left: -9em; }
li ul > li ul > li span.marginalizedparent { left: -11em; }
li ul > li ul > li ul > li span.marginalizedparent { left: -13em; }
div.footnoteNumberParent {
position: relative;
left: -4.7em;
}
a.marginalized {
position: absolute;
font-size: 75%;
text-align: right;
width: 5em;
}
a.enumerated_item_num {
position: relative;
left: -3.5em;
display: inline-block;
margin-right: -3em;
text-align: right;
width: 3em;
}
div.para { margin-bottom: 0.6em; margin-top: 0.6em; text-align: justify; }
div.section { text-align: justify; }
div.sentence { display: inline; }
span.indexparent {
display: inline;
position: relative;
float: right;
right: -1em;
}
a.index {
position: absolute;
display: none;
}
a.index:before { content: "⟵"; }

a.index:target {
display: inline;
}
.indexitems {
margin-left: 2em;
text-indent: -2em;
}
div.itemdescr {
margin-left: 3em;
}
.bnf {
font-family: serif;
margin-left: 40pt;
margin-top: 0.5em;
margin-bottom: 0.5em;
}
.ncbnf {
font-family: serif;
margin-top: 0.5em;
margin-bottom: 0.5em;
margin-left: 40pt;
}
.ncsimplebnf {
font-family: serif;
font-style: italic;
margin-top: 0.5em;
margin-bottom: 0.5em;
margin-left: 40pt;
background: inherit; 
}
span.textnormal {
font-style: normal;
font-family: serif;
white-space: normal;
display: inline-block;
}
span.rlap {
display: inline-block;
width: 0px;
}
span.descr { font-style: normal; font-family: serif; }
span.grammarterm { font-style: italic; }
span.term { font-style: italic; }
span.terminal { font-family: monospace; font-style: normal; }
span.nonterminal { font-style: italic; }
span.tcode { font-family: monospace; font-style: normal; }
span.textbf { font-weight: bold; }
span.textsc { font-variant: small-caps; }
a.nontermdef { font-style: italic; font-family: serif; }
span.emph { font-style: italic; }
span.techterm { font-style: italic; }
span.mathit { font-style: italic; }
span.mathsf { font-family: sans-serif; }
span.mathrm { font-family: serif; font-style: normal; }
span.textrm { font-family: serif; }
span.textsl { font-style: italic; }
span.mathtt { font-family: monospace; font-style: normal; }
span.mbox { font-family: serif; font-style: normal; }
span.ungap { display: inline-block; width: 2pt; }
span.textit { font-style: italic; }
span.texttt { font-family: monospace; }
span.tcode_in_codeblock { font-family: monospace; font-style: normal; }
span.phantom { color: white; }

span.math { font-style: normal; }
span.mathblock {
display: block;
margin-left: auto;
margin-right: auto;
margin-top: 1.2em;
margin-bottom: 1.2em;
text-align: center;
}
span.mathalpha {
font-style: italic;
}
span.synopsis {
font-weight: bold;
margin-top: 0.5em;
display: block;
}
span.definition {
font-weight: bold;
display: block;
}
.codeblock {
margin-left: 1.2em;
line-height: 127%;
}
.outputblock {
margin-left: 1.2em;
line-height: 127%;
}
div.itemdecl {
margin-top: 2ex;
}
code.itemdeclcode {
white-space: pre;
display: block;
}
span.textsuperscript {
vertical-align: super;
font-size: smaller;
line-height: 0;
}
.footnotenum { vertical-align: super; font-size: smaller; line-height: 0; }
.footnote {
font-size: small;
margin-left: 2em;
margin-right: 2em;
margin-top: 0.6em;
margin-bottom: 0.6em;
}
div.minipage {
display: inline-block;
margin-right: 3em;
}
div.numberedTable {
text-align: center;
margin: 2em;
}
div.figure {
text-align: center;
margin: 2em;
}
table {
border: 1px solid black;
border-collapse: collapse;
margin-left: auto;
margin-right: auto;
margin-top: 0.8em;
text-align: left;
hyphens: none; 
}
td, th {
padding-left: 1em;
padding-right: 1em;
vertical-align: top;
}
td.empty {
padding: 0px;
padding-left: 1px;
}
td.left {
text-align: left;
}
td.right {
text-align: right;
}
td.center {
text-align: center;
}
td.justify {
text-align: justify;
}
td.border {
border-left: 1px solid black;
}
tr.rowsep, td.cline {
border-top: 1px solid black;
}
tr.even, tr.odd {
border-bottom: 1px solid black;
}
tr.capsep {
border-top: 3px solid black;
border-top-style: double;
}
tr.header {
border-bottom: 3px solid black;
border-bottom-style: double;
}
th {
border-bottom: 1px solid black;
}
span.centry {
font-weight: bold;
}
div.table {
display: block;
margin-left: auto;
margin-right: auto;
text-align: center;
width: 90%;
}
span.indented {
display: block;
margin-left: 2em;
margin-bottom: 1em;
margin-top: 1em;
}
ol.enumeratea { list-style-type: none; background: inherit; }
ol.enumerate { list-style-type: none; background: inherit; }

code.sourceCode > span { display: inline; }
</style>
  <link href="data:image/x-icon;base64,AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AIJEAACCRAAAgkQAAIJEAACCRAAAgkQAVoJEAN6CRADegkQAWIJEAACCRAAAgkQAAIJEAACCRAAA////AP///wCCRAAAgkQAAIJEAACCRAAsgkQAvoJEAP+CRAD/gkQA/4JEAP+CRADAgkQALoJEAACCRAAAgkQAAP///wD///8AgkQAAIJEABSCRACSgkQA/IJEAP99PQD/dzMA/3czAP99PQD/gkQA/4JEAPyCRACUgkQAFIJEAAD///8A////AHw+AFiBQwDqgkQA/4BBAP9/PxP/uZd6/9rJtf/bybX/upd7/39AFP+AQQD/gkQA/4FDAOqAQgBc////AP///wDKklv4jlEa/3o7AP+PWC//8+3o///////////////////////z7un/kFox/35AAP+GRwD/mVYA+v///wD///8A0Zpk+NmibP+0d0T/8evj///////+/fv/1sKz/9bCs//9/fr//////+/m2/+NRwL/nloA/5xYAPj///8A////ANKaZPjRmGH/5cKh////////////k149/3UwAP91MQD/lmQ//86rhv+USg3/m1YA/5hSAP+bVgD4////AP///wDSmmT4zpJY/+/bx///////8+TV/8mLT/+TVx//gkIA/5lVAP+VTAD/x6B//7aEVv/JpH7/s39J+P///wD///8A0ppk+M6SWP/u2sf///////Pj1f/Nj1T/2KFs/8mOUv+eWhD/lEsA/8aee/+0glT/x6F7/7J8Rvj///8A////ANKaZPjRmGH/48Cf///////+/v7/2qt//82PVP/OkFX/37KJ/86siv+USg7/mVQA/5hRAP+bVgD4////AP///wDSmmT40ppk/9CVXP/69O////////7+/v/x4M//8d/P//7+/f//////9u7n/6tnJf+XUgD/nFgA+P///wD///8A0ppk+NKaZP/RmWL/1qNy//r07///////////////////////+vXw/9akdP/Wnmn/y5FY/6JfFvj///8A////ANKaZFTSmmTo0ppk/9GYYv/Ql1//5cWm//Hg0P/x4ND/5cWm/9GXYP/RmGH/0ppk/9KaZOjVnmpY////AP///wDSmmQA0ppkEtKaZI7SmmT60ppk/9CWX//OkVb/zpFW/9CWX//SmmT/0ppk/NKaZJDSmmQS0ppkAP///wD///8A0ppkANKaZADSmmQA0ppkKtKaZLrSmmT/0ppk/9KaZP/SmmT/0ppkvNKaZCrSmmQA0ppkANKaZAD///8A////ANKaZADSmmQA0ppkANKaZADSmmQA0ppkUtKaZNzSmmTc0ppkVNKaZADSmmQA0ppkANKaZADSmmQA////AP5/AAD4HwAA4AcAAMADAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAMADAADgBwAA+B8AAP5/AAAoAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wCCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAAyCRACMgkQA6oJEAOqCRACQgkQAEIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAA////AP///wD///8A////AIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRABigkQA5oJEAP+CRAD/gkQA/4JEAP+CRADqgkQAZoJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAAD///8A////AP///wD///8AgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAA4gkQAwoJEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQAxIJEADyCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAP///wD///8A////AP///wCCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAWgkQAmIJEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAJyCRAAYgkQAAIJEAACCRAAAgkQAAIJEAACCRAAA////AP///wD///8A////AIJEAACCRAAAgkQAAIJEAACCRAAAgkQAdIJEAPCCRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAPSCRAB4gkQAAIJEAACCRAAAgkQAAIJEAAD///8A////AP///wD///8AgkQAAIJEAACCRAAAgkQASoJEANKCRAD/gkQA/4JEAP+CRAD/g0YA/39AAP9zLgD/bSQA/2shAP9rIQD/bSQA/3MuAP9/PwD/g0YA/4JEAP+CRAD/gkQA/4JEAP+CRADUgkQAToJEAACCRAAAgkQAAP///wD///8A////AP///wB+PwAAgkUAIoJEAKiCRAD/gkQA/4JEAP+CRAD/hEcA/4BBAP9sIwD/dTAA/5RfKv+viF7/vp56/76ee/+wiF7/lWAr/3YxAP9sIwD/f0AA/4RHAP+CRAD/gkQA/4JEAP+CRAD/gkQArIJEACaBQwAA////AP///wD///8A////AIBCAEBzNAD6f0EA/4NFAP+CRAD/gkQA/4VIAP92MwD/bSUA/6N1Tv/ezsL/////////////////////////////////38/D/6V3Uv9uJgD/dTEA/4VJAP+CRAD/gkQA/4JEAP+BQwD/fUAA/4FDAEj///8A////AP///wD///8AzJRd5qBlKf91NgD/dDUA/4JEAP+FSQD/cy4A/3YyAP/PuKP//////////////////////////////////////////////////////9K7qP94NQD/ciwA/4VJAP+CRAD/fkEA/35BAP+LSwD/mlYA6v///wD///8A////AP///wDdpnL/4qx3/8KJUv+PUhf/cTMA/3AsAP90LgD/4dK+/////////////////////////////////////////////////////////////////+TYxf91MAD/dTIA/31CAP+GRwD/llQA/6FcAP+gWwD8////AP///wD///8A////ANGZY/LSm2X/4ap3/92mcP+wdT3/byQA/8mwj////////////////////////////////////////////////////////////////////////////+LYxv9zLgP/jUoA/59bAP+hXAD/nFgA/5xYAPL///8A////AP///wD///8A0ppk8tKaZP/RmWL/1p9q/9ubXv/XqXj////////////////////////////7+fD/vZyG/6BxS/+gcUr/vJuE//r37f//////////////////////3MOr/5dQBf+dVQD/nVkA/5xYAP+cWAD/nFgA8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/SmWP/yohJ//jo2P//////////////////////4NTG/4JDFf9lGAD/bSQA/20kAP9kGAD/fz8S/+Xb0f//////5NG9/6txN/+LOgD/m1QA/51aAP+cWAD/m1cA/5xYAP+cWADy////AP///wD///8A////ANKaZPLSmmT/0ppk/8+TWf/Unmv//v37//////////////////////+TWRr/VwsA/35AAP+ERgD/g0UA/4JGAP9lHgD/kFga/8KXX/+TRwD/jT4A/49CAP+VTQD/n10A/5xYAP+OQQD/lk4A/55cAPL///8A////AP///wD///8A0ppk8tKaZP/SmmT/y4tO/92yiP//////////////////////8NnE/8eCQP+rcTT/ez0A/3IyAP98PgD/gEMA/5FSAP+USwD/jj8A/5lUAP+JNwD/yqV2/694Mf+HNQD/jkAA/82rf/+laBj/jT4A8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/LiUr/4byY///////////////////////gupX/0I5P/+Wuev/Lklz/l1sj/308AP+QSwD/ol0A/59aAP+aVQD/k0oA/8yoh///////+fXv/6pwO//Lp3v///////Pr4f+oay7y////AP///wD///8A////ANKaZPLSmmT/0ppk/8uJSv/hvJj//////////////////////+G7l//Jhkb/0ppk/96nc//fqXX/x4xO/6dkFP+QSQD/llEA/5xXAP+USgD/yaOA///////38uv/qG05/8ijdv//////8efb/6ZpLPL///8A////AP///wD///8A0ppk8tKaZP/SmmT/zIxO/9yxh///////////////////////7dbA/8iEQf/Sm2X/0Zlj/9ScZv/eqHf/2KJv/7yAQf+XTgD/iToA/5lSAP+JNgD/yKFv/611LP+HNQD/jT8A/8qmeP+kZRT/jT4A8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/Pk1n/1J5q//78+//////////////////+/fv/1aFv/8iEQv/Tm2b/0ppl/9GZY//Wn2z/1pZc/9eldf/Bl2b/kUcA/4w9AP+OQAD/lUwA/59eAP+cWQD/jT8A/5ZOAP+eXADy////AP///wD///8A////ANKaZPLSmmT/0ppk/9KZY//KiEn/8d/P///////////////////////47+f/05tm/8iCP//KiEj/yohJ/8eCP//RmGH//vfy///////n1sP/rXQ7/4k4AP+TTAD/nVoA/5xYAP+cVwD/nFgA/5xYAPL///8A////AP///wD///8A0ppk8tKaZP/SmmT/0ptl/8uLTf/aq37////////////////////////////+/fz/6c2y/961jv/etY7/6Myx//78+v//////////////////////3MWv/5xXD/+ORAD/mFQA/51ZAP+cWAD/nFgA8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/SmmT/0ppk/8mFRP/s1b//////////////////////////////////////////////////////////////////////////////+PD/0JFU/7NzMv+WUQD/kUsA/5tXAP+dWQDy////AP///wD///8A////ANKaZP/SmmT/0ppk/9KaZP/Sm2X/z5NZ/8yMT//z5NX/////////////////////////////////////////////////////////////////9Ofa/8yNUP/UmGH/36p5/8yTWv+qaSD/kksA/5ROAPz///8A////AP///wD///8A0ppk5NKaZP/SmmT/0ppk/9KaZP/TnGf/zY9T/82OUv/t1sD//////////////////////////////////////////////////////+7Yw//OkFX/zI5R/9OcZ//SmmP/26V0/9ymdf/BhUf/ol8R6P///wD///8A////AP///wDSmmQ80ppk9tKaZP/SmmT/0ppk/9KaZP/TnGj/zpFW/8qJSv/dson/8uHS//////////////////////////////////Lj0//etIv/y4lL/86QVf/TnGj/0ppk/9KaZP/RmWP/05xn/9ymdfjUnWdC////AP///wD///8A////ANKaZADSmmQc0ppkotKaZP/SmmT/0ppk/9KaZP/Tm2b/0Zli/8qJSf/NjlH/16Z3/+G8mP/myKr/5siq/+G8mP/Xp3f/zY5S/8qISf/RmGH/05tm/9KaZP/SmmT/0ppk/9KaZP/SmmSm0pljINWdaQD///8A////AP///wD///8A0ppkANKaZADSmmQA0ppkQtKaZMrSmmT/0ppk/9KaZP/SmmT/0ptl/9GYYf/Nj1P/y4lL/8qISP/KiEj/y4lK/82PU//RmGH/0ptl/9KaZP/SmmT/0ppk/9KaZP/SmmTO0ppkRtKaZADSmmQA0ppkAP///wD///8A////AP///wDSmmQA0ppkANKaZADSmmQA0ppkANKaZGzSmmTu0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmTw0ppkcNKaZADSmmQA0ppkANKaZADSmmQA////AP///wD///8A////ANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZBLSmmSQ0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppklNKaZBTSmmQA0ppkANKaZADSmmQA0ppkANKaZAD///8A////AP///wD///8A0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQy0ppkutKaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppkvtKaZDbSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkAP///wD///8A////AP///wDSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkXNKaZODSmmT/0ppk/9KaZP/SmmT/0ppk5NKaZGDSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA////AP///wD///8A////ANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkBtKaZIbSmmTo0ppk6tKaZIrSmmQK0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZAD///8A////AP/8P///+B///+AH//+AAf//AAD//AAAP/AAAA/gAAAHwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA+AAAAfwAAAP/AAAP/8AAP//gAH//+AH///4H////D//" rel="icon" />
  <!--[if lt IE 9]>
    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
  <![endif]-->
  
</head>
<body>
<div class="wrapper">
<header id="title-block-header">
<h1 class="title" style="text-align:center">[[nodiscard]] in the Standard Library: Clause 23 Iterators library</h1>

<table style="border:none;float:right">
  <tr>
    <td>Document #:</td>
    <td>P2377R0</td>
  </tr>
  <tr>
    <td>Date:</td>
    <td>2021-05-11</td>
  </tr>
  <tr>
    <td style="vertical-align:top">Project:</td>
    <td>Programming Language C++</td>
  </tr>
  <tr>
    <td style="vertical-align:top">Audience:</td>
    <td>
      Library Evolution<br>
    </td>
  </tr>
  <tr>
    <td style="vertical-align:top">Reply-to:</td>
    <td>
      Christopher Di Bella<br>&lt;<a href="mailto:cjdb.ns@gmail.com" class="email">cjdb.ns@gmail.com</a>&gt;<br>
    </td>
  </tr>
</table>

</header>
<div style="clear:both">
<div id="TOC" role="doc-toc">
<h1 id="toctitle">Contents</h1>
<ul>
<li><a href="#abstract"><span class="toc-section-number">1</span> Abstract<span></span></a></li>
<li><a href="#change-log"><span class="toc-section-number">2</span> Change log<span></span></a>
<ul>
<li><a href="#r0"><span class="toc-section-number">2.1</span> R0<span></span></a></li>
</ul></li>
<li><a href="#motivation"><span class="toc-section-number">3</span> Motivation<span></span></a>
<ul>
<li><a href="#why-wasnt-this-done-in-c20"><span class="toc-section-number">3.1</span> Why wasn’t this done in C++20?<span></span></a></li>
<li><a href="#should-this-be-backported-to-earlier-c-standards"><span class="toc-section-number">3.2</span> Should this be backported to earlier C++ standards?<span></span></a></li>
</ul></li>
<li><a href="#design"><span class="toc-section-number">4</span> Design<span></span></a>
<ul>
<li><a href="#customisation-points"><span class="toc-section-number">4.1</span> Customisation points<span></span></a></li>
<li><a href="#iterator-operations-iterator.operations-and-range.iter.ops"><span class="toc-section-number">4.2</span> Iterator operations [iterator.operations] and [range.iter.ops]<span></span></a>
<ul>
<li><a href="#advance"><span class="toc-section-number">4.2.1</span> Advance<span></span></a></li>
<li><a href="#distance"><span class="toc-section-number">4.2.2</span> Distance<span></span></a></li>
<li><a href="#next-and-prev"><span class="toc-section-number">4.2.3</span> Next and prev<span></span></a></li>
</ul></li>
<li><a href="#predefined-iterators-and-sentinels"><span class="toc-section-number">4.3</span> Predefined iterators and sentinels<span></span></a>
<ul>
<li><a href="#reverse-iterator"><span class="toc-section-number">4.3.1</span> Reverse iterator<span></span></a></li>
<li><a href="#insert-iterators"><span class="toc-section-number">4.3.2</span> Insert iterators<span></span></a></li>
<li><a href="#move-iterators-and-sentinels"><span class="toc-section-number">4.3.3</span> Move iterators and sentinels<span></span></a></li>
<li><a href="#range-access"><span class="toc-section-number">4.3.4</span> Range access<span></span></a></li>
</ul></li>
</ul></li>
<li><a href="#future-work"><span class="toc-section-number">5</span> Future work<span></span></a>
<ul>
<li><a href="#why-this-is-worth-the-committees-time"><span class="toc-section-number">5.1</span> Why this is worth the committee’s time<span></span></a></li>
</ul></li>
<li><a href="#proposed-wording"><span class="toc-section-number">6</span> Proposed wording<span></span></a>
<ul>
<li><a href="#customization-point-object-types-customization.point.object"><span class="toc-section-number">6.1</span> Customization point object types [customization.point.object]<span></span></a></li>
<li><a href="#header-iterator-synopsis-iterator.synopsis"><span class="toc-section-number">6.2</span> Header <code class="sourceCode default">&lt;iterator&gt;</code> synopsis [iterator.synopsis]<span></span></a></li>
<li><a href="#class-template-reverse_iterator-reverse.iterator"><span class="toc-section-number">6.3</span> Class template <code class="sourceCode default">reverse_iterator</code> [reverse.iterator]<span></span></a></li>
<li><a href="#class-template-back_insert_iterator-back.insert.iterator"><span class="toc-section-number">6.4</span> Class template <code class="sourceCode default">back_insert_iterator</code> [back.insert.iterator]<span></span></a></li>
<li><a href="#class-template-front_insert_iterator-front.insert.iterator"><span class="toc-section-number">6.5</span> Class template <code class="sourceCode default">front_insert_iterator</code> [front.insert.iterator]<span></span></a></li>
<li><a href="#class-template-insert_iterator-insert.iterator"><span class="toc-section-number">6.6</span> Class template <code class="sourceCode default">insert_iterator</code> [insert.iterator]<span></span></a></li>
</ul></li>
<li><a href="#class-template-move_iterator-move.iterator"><span class="toc-section-number">7</span> Class template <code class="sourceCode default">move_iterator</code> [move.iterator]<span></span></a>
<ul>
<li><a href="#class-template-move_sentinel-move.sentinel"><span class="toc-section-number">7.1</span> Class template <code class="sourceCode default">move_sentinel</code> [move.sentinel]<span></span></a></li>
<li><a href="#class-template-common_iterator-common.iterator"><span class="toc-section-number">7.2</span> Class template <code class="sourceCode default">common_iterator</code> [common.iterator]<span></span></a></li>
<li><a href="#class-template-counted_iterator-counted.iterator"><span class="toc-section-number">7.3</span> Class template <code class="sourceCode default">counted_iterator</code> [counted.iterator]<span></span></a></li>
<li><a href="#class-template-istream_iterator-istream.iterator"><span class="toc-section-number">7.4</span> Class template <code class="sourceCode default">istream_iterator</code> [istream.iterator]<span></span></a></li>
<li><a href="#class-template-ostream_iterator-ostream.iterator"><span class="toc-section-number">7.5</span> Class template <code class="sourceCode default">ostream_iterator</code> [ostream.iterator]<span></span></a></li>
<li><a href="#class-template-istreambuf_iterator-istreambuf.iterator"><span class="toc-section-number">7.6</span> Class template <code class="sourceCode default">istreambuf_iterator</code> [istreambuf.iterator]<span></span></a></li>
<li><a href="#class-template-ostreambuf_iterator-ostreambuf.iterator"><span class="toc-section-number">7.7</span> Class template <code class="sourceCode default">ostreambuf_iterator</code> [ostreambuf.iterator]<span></span></a></li>
</ul></li>
<li><a href="#acknowledgements"><span class="toc-section-number">8</span> Acknowledgements<span></span></a></li>
</ul>
</div>
<h1 data-number="1" id="abstract"><span class="header-section-number">1</span> Abstract<a href="#abstract" class="self-link"></a></h1>
<p>During NB ballot resolution for C++20, GB254 and GB271 requested that certain <code class="sourceCode default">ranges</code> operations be marked <code class="sourceCode default">[[nodiscard]]</code> to indicate their return values are the salient focus of the call. Library Evolution rejected this request because “of the specification complexity for the CPOs in question it isn’t clear <em>where</em> to add <code class="sourceCode default">[[nodiscard]]</code>. This can be done later with a paper that resolves that wording issue. No consensus for change in C++20”.</p>
<p>This paper revisits the issue for the whole of the iterators library.</p>
<h1 data-number="2" id="change-log"><span class="header-section-number">2</span> Change log<a href="#change-log" class="self-link"></a></h1>
<h2 data-number="2.1" id="r0"><span class="header-section-number">2.1</span> R0<a href="#r0" class="self-link"></a></h2>
<p>Initial paper.</p>
<h1 data-number="3" id="motivation"><span class="header-section-number">3</span> Motivation<a href="#motivation" class="self-link"></a></h1>
<p>C++’s defaults are often backwards. We have <code class="sourceCode default">explicit</code> instead of <code class="sourceCode default">implicit</code>, <code class="sourceCode default">noexcept</code> instead of <code class="sourceCode default">throws</code>, <code class="sourceCode default">const</code> instead of <code class="sourceCode default">mutable</code>, and <code class="sourceCode default">[[nodiscard]]</code> instead of <code class="sourceCode default">[[discardable]]</code>, to name a few. Humans often make mistakes (and costly ones at that), so it’s good to turn these sorts of things on whenever they make sense to do so. For example, <code class="sourceCode default">std::ranges::empty</code> may be interpreted to be a <code class="sourceCode default">clear</code> operation, because it lacks an <code class="sourceCode default">is_</code> prefix. Thus, the expression-stamtement <code class="sourceCode default">std::ranges::empty(r);</code> is problematic, because it’s not doing what the user intended. The author is of the opinion that <em>any</em> operations where the salient feature is its return value fall into this category, regardless of whether or not the operation should be prefixed with something like <code class="sourceCode default">is_</code>. For example, <code class="sourceCode default">std::ranges::next(i);</code> is another expression-statement that’s as smelly as <code class="sourceCode default">std::ranges::empty(r);</code>: why is the result of a modified copy being discarded? The result should either be used or the operation shouldn’t be called.</p>
<h2 data-number="3.1" id="why-wasnt-this-done-in-c20"><span class="header-section-number">3.1</span> Why wasn’t this done in C++20?<a href="#why-wasnt-this-done-in-c20" class="self-link"></a></h2>
<p>C++20 NB comment GB254 requested:</p>
<blockquote>
<p>Most of the ranges iterator operations should be marked <code class="sourceCode default">[[nodiscard]]</code> These are equality-preserving operations that return values always intended to be used. The library should reflect this.</p>
</blockquote>
<blockquote>
<p>Proposed change: Add <code class="sourceCode default">[[nodiscard]]</code> to the following operations.</p>
<ul>
<li><code class="sourceCode default">ranges::iter_move</code></li>
<li><code class="sourceCode default">ranges::distance</code></li>
<li><code class="sourceCode default">ranges::next</code></li>
<li><code class="sourceCode default">ranges::prev</code></li>
</ul>
</blockquote>
<p>The BSI C++ panel has a policy requiring each NB comment to be co-sponsored, and mustn’t be controversial. Due to the volume of NB comments, and the fact that it wasn’t clear what some of the wording should look like, LEWG issued the following response.</p>
<blockquote>
<p>LEWG in Belfast: Because of the specification complexity for the CPOs in question it isn’t clear <em>where</em> to add <code class="sourceCode default">[[nodiscard]]</code>. This can be done later with a paper that resolves that wording issue. No consensus for change in C++20.</p>
</blockquote>
<h2 data-number="3.2" id="should-this-be-backported-to-earlier-c-standards"><span class="header-section-number">3.2</span> Should this be backported to earlier C++ standards?<a href="#should-this-be-backported-to-earlier-c-standards" class="self-link"></a></h2>
<p>The author recommends that implementers apply <code class="sourceCode default">[[nodiscard]]</code> to relevant sections for C++17 and C++20.</p>
<h1 data-number="4" id="design"><span class="header-section-number">4</span> Design<a href="#design" class="self-link"></a></h1>
<p>Not everything in the standard library should be marked <code class="sourceCode default">[[nodiscard]]</code>. We’ll consider every operation, and discuss whether or not it’s a good idea to slap the attribute on the operation’s side. For convenience, we use the term <em>pure</em> to mean that using the result of the operation is the sole purpose of using it, and that either the result should be used or the operation shouldn’t happen: these functions should be marked <code class="sourceCode default">[[nodiscard]]</code>. We use the term <em>side effect</em> to indicate that the focus isn’t on a return value (if one exists); and while the result may be interesting, it result mightn’t be useful, and thus shouldn’t be specified as <code class="sourceCode default">[[nodiscard]]</code>.</p>
<h2 data-number="4.1" id="customisation-points"><span class="header-section-number">4.1</span> Customisation points<a href="#customisation-points" class="self-link"></a></h2>
<ul>
<li><code class="sourceCode default">ranges::iter_move</code> is <em>pure</em> (despite the fact it moves).</li>
<li><code class="sourceCode default">ranges::iter_swap</code>’s return type is <code class="sourceCode default">void</code>, which doesn’t need to be discarded.</li>
</ul>
<p>It should be noted that the wording for customisation point objects is very different from other invocables in the standard library. Most invocables are either specified as functions or explicitly as function objects. While CPOs are function objects, their definitions are much more fuzzy, and there’s no “interface” to apply a <code class="sourceCode default">[[nodiscard]]</code> to.</p>
<p>The author can think of two ways in which we can apply the attribute.</p>
<p>One way is to simply make <em>expression-statements</em> equivalent to <code class="sourceCode default">ranges::iter_move(E);</code> ill-formed, no diagnostic required. This implies a <code class="sourceCode default">[[nodiscard]]</code> attribute is applicable: a diagnostic <em>may</em> be issued, or the diagnostic may be turned off. A potential issue with this approach is that LEWG will need to consider this for every non-<code class="sourceCode default">void</code> returning CPO, including all range adaptor closure objects. This doesn’t scale well.</p>
<p>Another way is to add blanket wording to [customization.point.object], saying something along the lines of</p>
<blockquote>
<p>Unless otherwise specified, if the return type of a function call operator is not <code class="sourceCode default">void</code>, then its <em>attribute-specifier-seq</em> shall include <code class="sourceCode default">[[nodiscard]]</code>.</p>
</blockquote>
<p>This blanket wording, if adopted, means that <code class="sourceCode default">ranges::begin</code>, etc., won’t need to be addressed in <em><code class="sourceCode default">[[nodiscard]]</code> in the Standard Library: Clause 24 Ranges library</em>. It also covers any future CPOs that we might introduce. It also explicitly indicates that the <code class="sourceCode default">[[nodiscard]]</code> is to be applied to a call operator, and offers escape hatches for both <code class="sourceCode default">void</code>-returning call operators and CPOs where the return value might not always be interesting. Given these reasons, the author favours this approach over the IFNDR one.</p>
<h2 data-number="4.2" id="iterator-operations-iterator.operations-and-range.iter.ops"><span class="header-section-number">4.2</span> Iterator operations [iterator.operations] and [range.iter.ops]<a href="#iterator-operations-iterator.operations-and-range.iter.ops" class="self-link"></a></h2>
<h3 data-number="4.2.1" id="advance"><span class="header-section-number">4.2.1</span> Advance<a href="#advance" class="self-link"></a></h3>
<ul>
<li><code class="sourceCode default">std::advance</code>, <code class="sourceCode default">std::ranges::advance(i, n)</code>, and <code class="sourceCode default">std::ranges::advance(i, s)</code>’s return types are <code class="sourceCode default">void</code>, which doesn’t need to be discarded.</li>
<li><code class="sourceCode default">std::ranges::advance(i, n, s)</code> has a <em>side effect</em>.</li>
</ul>
<h3 data-number="4.2.2" id="distance"><span class="header-section-number">4.2.2</span> Distance<a href="#distance" class="self-link"></a></h3>
<p><code class="sourceCode default">std::distance</code> and both overloads for <code class="sourceCode default">std::ranges::distance</code> are <em>pure</em>.</p>
<h3 data-number="4.2.3" id="next-and-prev"><span class="header-section-number">4.2.3</span> Next and prev<a href="#next-and-prev" class="self-link"></a></h3>
<p><code class="sourceCode default">std::(ranges::)?next</code> and <code class="sourceCode default">std::(ranges::)?prev</code> copy an iterator, advance it, and then return the advanced iterator by value. These are <em>pure</em>.</p>
<h2 data-number="4.3" id="predefined-iterators-and-sentinels"><span class="header-section-number">4.3</span> Predefined iterators and sentinels<a href="#predefined-iterators-and-sentinels" class="self-link"></a></h2>
<ul>
<li>All comparisons are <em>pure</em>.</li>
<li>All <code class="sourceCode default">operator*</code>s, <code class="sourceCode default">operator[]</code>s, and <code class="sourceCode default">operator-&gt;</code>s are <em>pure</em>.</li>
<li>All assignment and compound assingment operations have <em>side effects</em>.</li>
<li>All increment and decrement operations have <em>side effects</em>.</li>
<li>All <code class="sourceCode default">operator+</code>s and <code class="sourceCode default">operator-</code>s are <em>pure</em>.</li>
<li>All <code class="sourceCode default">const</code>- and reference-qualified member functions are <em>pure</em>.</li>
<li>All <code class="sourceCode default">iter_move</code> friends are <em>pure</em> (despite the fact they move).</li>
</ul>
<p>Despite the fact that post-increment and post-decrement operations have <em>side effects</em>, the author believes that non-<code class="sourceCode default">void</code> post-increment and post-decrement operations should communicate to the reader that the result is intended to be used (and thus should be marked <code class="sourceCode default">[[nodiscard]]</code>). However, after around eight years of teaching and code reviews, the author isn’t convinced that this viewpoint is standard practice.</p>
<h3 data-number="4.3.1" id="reverse-iterator"><span class="header-section-number">4.3.1</span> Reverse iterator<a href="#reverse-iterator" class="self-link"></a></h3>
<ul>
<li><code class="sourceCode default">std::make_reverse_iterator</code> is <em>pure</em>.</li>
</ul>
<h3 data-number="4.3.2" id="insert-iterators"><span class="header-section-number">4.3.2</span> Insert iterators<a href="#insert-iterators" class="self-link"></a></h3>
<ul>
<li><code class="sourceCode default">std::back_inserter</code>, <code class="sourceCode default">std::front_inserter</code>, and <code class="sourceCode default">std::inserter</code> are <em>pure</em>.</li>
</ul>
<h3 data-number="4.3.3" id="move-iterators-and-sentinels"><span class="header-section-number">4.3.3</span> Move iterators and sentinels<a href="#move-iterators-and-sentinels" class="self-link"></a></h3>
<ul>
<li><code class="sourceCode default">std::make_move_iterator</code> is <em>pure</em>.</li>
</ul>
<h3 data-number="4.3.4" id="range-access"><span class="header-section-number">4.3.4</span> Range access<a href="#range-access" class="self-link"></a></h3>
<p>All of <code class="sourceCode default">c?r?begin</code>, <code class="sourceCode default">c?r?end</code>, <code class="sourceCode default">s?size</code>, <code class="sourceCode default">empty</code>, and <code class="sourceCode default">data</code> are <em>pure</em>.</p>
<h1 data-number="5" id="future-work"><span class="header-section-number">5</span> Future work<a href="#future-work" class="self-link"></a></h1>
<p>If Library Evolution has an appetite for this paper, then the author will readily pen similar papers for the ranges library, the algorithms library, and the some of the general utilities library. The author is willing to also assess the containers and string libraries. Other sections of the standard library should probably be addressed by folks with more experience using those sections.</p>
<h2 data-number="5.1" id="why-this-is-worth-the-committees-time"><span class="header-section-number">5.1</span> Why this is worth the committee’s time<a href="#why-this-is-worth-the-committees-time" class="self-link"></a></h2>
<p>This proposal, and any that follow it, are worth the committee’s time is because it’s the right thing to do. We have an obligation to provide a quality standard, and ensuring this attribute is applied where it’s relevant improves the quality of the document. Microsoft/STL already aggressively purues adding <code class="sourceCode default">[[nodiscard]]</code> to things that aren’t explicitly marked as such in the standard, but libc++ and libstdc++ don’t seem to have it in anywhere near as many places (a case-insensitive search for both <code class="sourceCode default">nodiscard</code> and <code class="sourceCode default">warn_unused_result</code> was conducted). This could be regarded as a quality-of-implementation issue, with MSVC clearly being in the lead, but since this is interface-related, we have the opportunity to unilaterally improve all implementations. By adding <code class="sourceCode default">[[nodiscard]]</code> to the synopses, we remind implementers that they should consider adding it to their respective implementations, which is similar to how Clang, GCC, and MSVC treat an unused result when it’s marked with <code class="sourceCode default">[[nodiscard]]</code>. Implementations are free to disregard a placed attribute, but doing so becomes an active decision regarding QoI, rather than a possible human oversight that can be easily missed in the code review stage.</p>
<p>A secondary argument is that although the primary audience for the International Standard are the implementers (who often partake in authoring it), they are not the only audience. A key secondary audience to consider in this proposal’s space are people who translate parts of the International Standard into material that’s more digestible for the average C++ programmer: online documentation authors, book authors, teachers, and so on. While committee members seem to be aware that implementers can choose to disregard what the standard has to say about attributes, the author hasn’t been able to find any explicit wording outlining this. Instead, it seems to be implied by the <em>as if</em> rule, since most attributes do not change the meaning of a program. This isn’t a trivial property, and while the primary audience knows this, this secondary educational audience can be forgiven for not being aware of it.</p>
<p>This audit only needs to happen once for each clause, if Library Evolution ensures that <code class="sourceCode default">[[nodiscard]]</code> is considered during the design review. We don’t need to dedicate lots of time to this effort either. We could set up a task force consisting of interested peoples; once a clause has been audited, it can be forwarded to Library Evolution for a brief review, mostly as a formality.</p>
<h1 data-number="6" id="proposed-wording"><span class="header-section-number">6</span> Proposed wording<a href="#proposed-wording" class="self-link"></a></h1>
<p>To avoid repetition, the proposed wording only concerns itself with synopses. Since <code class="sourceCode default">[[nodiscard]]</code> is really only necessary on one declaration, it’s left up to the editors to decide whether or not each section should apply <code class="sourceCode default">[[nodiscard]]</code> too.</p>
<h2 data-number="6.1" id="customization-point-object-types-customization.point.object"><span class="header-section-number">6.1</span> Customization point object types [customization.point.object]<a href="#customization-point-object-types-customization.point.object" class="self-link"></a></h2>
<p>…</p>
<p><span class="marginalizedparent"><a class="marginalized">5</a></span> Each customization point object type constrains its return type to model a particular concept.</p>
<p><span class="add" style="color: #006e28"><ins><span class="marginalizedparent"><a class="marginalized">6</a></span> Unless otherwise specified, if the return type of a function call operator is not <span><code class="sourceCode default">void</code></span>, then its <em>attribute-specifier-seq</em> shall include <span><code class="sourceCode default">[[nodiscard]]</code></span>.</ins></span></p>
<p>…</p>
<h2 data-number="6.2" id="header-iterator-synopsis-iterator.synopsis"><span class="header-section-number">6.2</span> Header <code class="sourceCode default">&lt;iterator&gt;</code> synopsis [iterator.synopsis]<a href="#header-iterator-synopsis-iterator.synopsis" class="self-link"></a></h2>
<div class="sourceCode" id="cb1"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb1-1"><a href="#cb1-1"></a><span class="co">// [iterator.operations], iterator operations</span></span>
<span id="cb1-2"><a href="#cb1-2"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> InputIterator, <span class="kw">class</span> Distance<span class="op">&gt;</span></span>
<span id="cb1-3"><a href="#cb1-3"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span></span>
<span id="cb1-4"><a href="#cb1-4"></a>    advance<span class="op">(</span>InputIterator<span class="op">&amp;</span> i, Distance n<span class="op">)</span>;</span>
<span id="cb1-5"><a href="#cb1-5"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> InputIterator<span class="op">&gt;</span></span>
<span id="cb1-6"><a href="#cb1-6"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">typename</span> iterator_traits<span class="op">&lt;</span>InputIterator<span class="op">&gt;::</span>difference_type</span>
<span id="cb1-7"><a href="#cb1-7"></a>    distance<span class="op">(</span>InputIterator first, InputIterator last<span class="op">)</span>;</span>
<span id="cb1-8"><a href="#cb1-8"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> InputIterator<span class="op">&gt;</span></span>
<span id="cb1-9"><a href="#cb1-9"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> InputIterator</span>
<span id="cb1-10"><a href="#cb1-10"></a>    next<span class="op">(</span>InputIterator x,</span>
<span id="cb1-11"><a href="#cb1-11"></a>         <span class="kw">typename</span> iterator_traits<span class="op">&lt;</span>InputIterator<span class="op">&gt;::</span>difference_type n <span class="op">=</span> <span class="dv">1</span><span class="op">)</span>;</span>
<span id="cb1-12"><a href="#cb1-12"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> InputIterator<span class="op">&gt;</span></span>
<span id="cb1-13"><a href="#cb1-13"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> InputIterator</span>
<span id="cb1-14"><a href="#cb1-14"></a>    prev<span class="op">(</span>InputIterator x,</span>
<span id="cb1-15"><a href="#cb1-15"></a>         <span class="kw">typename</span> iterator_traits<span class="op">&lt;</span>InputIterator<span class="op">&gt;::</span>difference_type n <span class="op">=</span> <span class="dv">1</span><span class="op">)</span>;</span>
<span id="cb1-16"><a href="#cb1-16"></a></span>
<span id="cb1-17"><a href="#cb1-17"></a><span class="co">// [range.iter.ops], range iterator operations</span></span>
<span id="cb1-18"><a href="#cb1-18"></a><span class="kw">namespace</span> ranges <span class="op">{</span></span>
<span id="cb1-19"><a href="#cb1-19"></a>  <span class="op">...</span></span>
<span id="cb1-20"><a href="#cb1-20"></a>  <span class="co">// [range.iter.op.distance], ranges::distance</span></span>
<span id="cb1-21"><a href="#cb1-21"></a>  <span class="kw">template</span><span class="op">&lt;</span>input_or_output_iterator I, sentinel_for<span class="op">&lt;</span>I<span class="op">&gt;</span> S<span class="op">&gt;</span></span>
<span id="cb1-22"><a href="#cb1-22"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> iter_difference_t<span class="op">&lt;</span>I<span class="op">&gt;</span> distance<span class="op">(</span>I first, S last<span class="op">)</span>;</span>
<span id="cb1-23"><a href="#cb1-23"></a>  <span class="kw">template</span><span class="op">&lt;</span>range R<span class="op">&gt;</span></span>
<span id="cb1-24"><a href="#cb1-24"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> range_difference_t<span class="op">&lt;</span>R<span class="op">&gt;</span> distance<span class="op">(</span>R<span class="op">&amp;&amp;</span> r<span class="op">)</span>;</span>
<span id="cb1-25"><a href="#cb1-25"></a></span>
<span id="cb1-26"><a href="#cb1-26"></a>  <span class="co">// [range.iter.op.next], ranges::next</span></span>
<span id="cb1-27"><a href="#cb1-27"></a>  <span class="kw">template</span><span class="op">&lt;</span>input_or_output_iterator I<span class="op">&gt;</span></span>
<span id="cb1-28"><a href="#cb1-28"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> I next<span class="op">(</span>I x<span class="op">)</span>;</span>
<span id="cb1-29"><a href="#cb1-29"></a>  <span class="kw">template</span><span class="op">&lt;</span>input_or_output_iterator I<span class="op">&gt;</span></span>
<span id="cb1-30"><a href="#cb1-30"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> I next<span class="op">(</span>I x, iter_difference_t<span class="op">&lt;</span>I<span class="op">&gt;</span> n<span class="op">)</span>;</span>
<span id="cb1-31"><a href="#cb1-31"></a>  <span class="kw">template</span><span class="op">&lt;</span>input_or_output_iterator I, sentinel_for<span class="op">&lt;</span>I<span class="op">&gt;</span> S<span class="op">&gt;</span></span>
<span id="cb1-32"><a href="#cb1-32"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> I next<span class="op">(</span>I x, S bound<span class="op">)</span>;</span>
<span id="cb1-33"><a href="#cb1-33"></a>  <span class="kw">template</span><span class="op">&lt;</span>input_or_output_iterator I, sentinel_for<span class="op">&lt;</span>I<span class="op">&gt;</span> S<span class="op">&gt;</span></span>
<span id="cb1-34"><a href="#cb1-34"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> I next<span class="op">(</span>I x, iter_difference_t<span class="op">&lt;</span>I<span class="op">&gt;</span> n, S bound<span class="op">)</span>;</span>
<span id="cb1-35"><a href="#cb1-35"></a></span>
<span id="cb1-36"><a href="#cb1-36"></a>  <span class="co">// [range.iter.op.next], ranges::next</span></span>
<span id="cb1-37"><a href="#cb1-37"></a>  <span class="kw">template</span><span class="op">&lt;</span>bidirectional_iterator I<span class="op">&gt;</span></span>
<span id="cb1-38"><a href="#cb1-38"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> I prev<span class="op">(</span>I x<span class="op">)</span>;</span>
<span id="cb1-39"><a href="#cb1-39"></a>  <span class="kw">template</span><span class="op">&lt;</span>bidirectional_iterator I<span class="op">&gt;</span></span>
<span id="cb1-40"><a href="#cb1-40"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> I prev<span class="op">(</span>I x, iter_difference_t<span class="op">&lt;</span>I<span class="op">&gt;</span> n<span class="op">)</span>;</span>
<span id="cb1-41"><a href="#cb1-41"></a>  <span class="kw">template</span><span class="op">&lt;</span>bidirectional_iterator I<span class="op">&gt;</span></span>
<span id="cb1-42"><a href="#cb1-42"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> I prev<span class="op">(</span>I x, iter_difference_t<span class="op">&lt;</span>I<span class="op">&gt;</span> n, S bound<span class="op">)</span>;</span>
<span id="cb1-43"><a href="#cb1-43"></a><span class="op">}</span></span>
<span id="cb1-44"><a href="#cb1-44"></a></span>
<span id="cb1-45"><a href="#cb1-45"></a><span class="co">// [predef.iterators], predefined iterators and sentinels</span></span>
<span id="cb1-46"><a href="#cb1-46"></a><span class="co">// [reverse.iterators], reverse iterators</span></span>
<span id="cb1-47"><a href="#cb1-47"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator<span class="op">&gt;</span> <span class="kw">class</span> reverse_iterator;</span>
<span id="cb1-48"><a href="#cb1-48"></a></span>
<span id="cb1-49"><a href="#cb1-49"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator1, <span class="kw">class</span> Iterator2<span class="op">&gt;</span></span>
<span id="cb1-50"><a href="#cb1-50"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span></span>
<span id="cb1-51"><a href="#cb1-51"></a>    <span class="kw">const</span> reverse_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> x,</span>
<span id="cb1-52"><a href="#cb1-52"></a>    <span class="kw">const</span> reverse_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb1-53"><a href="#cb1-53"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator1, <span class="kw">class</span> Iterator2<span class="op">&gt;</span></span>
<span id="cb1-54"><a href="#cb1-54"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">!=(</span></span>
<span id="cb1-55"><a href="#cb1-55"></a>    <span class="kw">const</span> reverse_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> x,</span>
<span id="cb1-56"><a href="#cb1-56"></a>    <span class="kw">const</span> reverse_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb1-57"><a href="#cb1-57"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator1, <span class="kw">class</span> Iterator2<span class="op">&gt;</span></span>
<span id="cb1-58"><a href="#cb1-58"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&lt;(</span></span>
<span id="cb1-59"><a href="#cb1-59"></a>    <span class="kw">const</span> reverse_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> x,</span>
<span id="cb1-60"><a href="#cb1-60"></a>    <span class="kw">const</span> reverse_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb1-61"><a href="#cb1-61"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator1, <span class="kw">class</span> Iterator2<span class="op">&gt;</span></span>
<span id="cb1-62"><a href="#cb1-62"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&gt;(</span></span>
<span id="cb1-63"><a href="#cb1-63"></a>    <span class="kw">const</span> reverse_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> x,</span>
<span id="cb1-64"><a href="#cb1-64"></a>    <span class="kw">const</span> reverse_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb1-65"><a href="#cb1-65"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator1, <span class="kw">class</span> Iterator2<span class="op">&gt;</span></span>
<span id="cb1-66"><a href="#cb1-66"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&lt;=(</span></span>
<span id="cb1-67"><a href="#cb1-67"></a>    <span class="kw">const</span> reverse_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> x,</span>
<span id="cb1-68"><a href="#cb1-68"></a>    <span class="kw">const</span> reverse_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb1-69"><a href="#cb1-69"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator1, <span class="kw">class</span> Iterator2<span class="op">&gt;</span></span>
<span id="cb1-70"><a href="#cb1-70"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&gt;=(</span></span>
<span id="cb1-71"><a href="#cb1-71"></a>    <span class="kw">const</span> reverse_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> x,</span>
<span id="cb1-72"><a href="#cb1-72"></a>    <span class="kw">const</span> reverse_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb1-73"><a href="#cb1-73"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator1, three_way_comparable_with<span class="op">&lt;</span>Iterator1<span class="op">&gt;</span> Iterator2<span class="op">&gt;</span></span>
<span id="cb1-74"><a href="#cb1-74"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> compare_three_way_result_t<span class="op">&lt;</span>Iterator1, Iterator2<span class="op">&gt;</span></span>
<span id="cb1-75"><a href="#cb1-75"></a>    <span class="kw">operator</span><span class="op">&lt;=&gt;(</span><span class="kw">const</span> reverse_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> x,</span>
<span id="cb1-76"><a href="#cb1-76"></a>                <span class="kw">const</span> reverse_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb1-77"><a href="#cb1-77"></a></span>
<span id="cb1-78"><a href="#cb1-78"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator1, <span class="kw">class</span> Iterator2<span class="op">&gt;</span></span>
<span id="cb1-79"><a href="#cb1-79"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">auto</span> <span class="kw">operator</span><span class="op">-(</span></span>
<span id="cb1-80"><a href="#cb1-80"></a>    <span class="kw">const</span> reverse_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> x,</span>
<span id="cb1-81"><a href="#cb1-81"></a>    <span class="kw">const</span> reverse_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> y<span class="op">)</span> <span class="op">-&gt;</span> <span class="kw">decltype</span><span class="op">(</span>y<span class="op">.</span>base<span class="op">()</span> <span class="op">-</span> x<span class="op">.</span>base<span class="op">())</span>;</span>
<span id="cb1-82"><a href="#cb1-82"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator<span class="op">&gt;</span></span>
<span id="cb1-83"><a href="#cb1-83"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> reverse_iterator<span class="op">&lt;</span>Iterator<span class="op">&gt;</span> <span class="kw">operator</span><span class="op">+(</span></span>
<span id="cb1-84"><a href="#cb1-84"></a>    iter_difference_t<span class="op">&lt;</span>Iterator<span class="op">&gt;</span> n,</span>
<span id="cb1-85"><a href="#cb1-85"></a>    <span class="kw">const</span> reverse_iterator<span class="op">&lt;</span>Iterator<span class="op">&gt;&amp;</span> x<span class="op">)</span>;</span>
<span id="cb1-86"><a href="#cb1-86"></a></span>
<span id="cb1-87"><a href="#cb1-87"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator<span class="op">&gt;</span></span>
<span id="cb1-88"><a href="#cb1-88"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> reverse_iterator<span class="op">&lt;</span>Iterator<span class="op">&gt;</span> make_reverse_iterator<span class="op">(</span>Iterator i<span class="op">)</span>;</span>
<span id="cb1-89"><a href="#cb1-89"></a></span>
<span id="cb1-90"><a href="#cb1-90"></a><span class="co">// [insert.iterators], insert iterators</span></span>
<span id="cb1-91"><a href="#cb1-91"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Container<span class="op">&gt;</span> <span class="kw">class</span> back_insert_iterator;</span>
<span id="cb1-92"><a href="#cb1-92"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Container<span class="op">&gt;</span></span>
<span id="cb1-93"><a href="#cb1-93"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> back_insert_iterator<span class="op">&lt;</span>Container<span class="op">&gt;</span> back_inserter<span class="op">(</span>Container<span class="op">&amp;</span> x<span class="op">)</span>;</span>
<span id="cb1-94"><a href="#cb1-94"></a></span>
<span id="cb1-95"><a href="#cb1-95"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Container<span class="op">&gt;</span> <span class="kw">class</span> front_insert_iterator;</span>
<span id="cb1-96"><a href="#cb1-96"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Container<span class="op">&gt;</span></span>
<span id="cb1-97"><a href="#cb1-97"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> front_insert_iterator<span class="op">&lt;</span>Container<span class="op">&gt;</span> front_inserter<span class="op">(</span>Container<span class="op">&amp;</span> x<span class="op">)</span>;</span>
<span id="cb1-98"><a href="#cb1-98"></a></span>
<span id="cb1-99"><a href="#cb1-99"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Container<span class="op">&gt;</span> <span class="kw">class</span> insert_iterator;</span>
<span id="cb1-100"><a href="#cb1-100"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Container<span class="op">&gt;</span></span>
<span id="cb1-101"><a href="#cb1-101"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> insert_iterator<span class="op">&lt;</span>Container<span class="op">&gt;</span></span>
<span id="cb1-102"><a href="#cb1-102"></a>    inserter<span class="op">(</span>Container<span class="op">&amp;</span> x, ranges<span class="op">::</span>iterator_t<span class="op">&lt;</span>Container<span class="op">&gt;</span> i<span class="op">)</span>;</span>
<span id="cb1-103"><a href="#cb1-103"></a></span>
<span id="cb1-104"><a href="#cb1-104"></a><span class="co">// [move.iterators], move iterators and sentinels</span></span>
<span id="cb1-105"><a href="#cb1-105"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator<span class="op">&gt;</span> <span class="kw">class</span> move_iterator;</span>
<span id="cb1-106"><a href="#cb1-106"></a></span>
<span id="cb1-107"><a href="#cb1-107"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator1, <span class="kw">class</span> Iterator2<span class="op">&gt;</span></span>
<span id="cb1-108"><a href="#cb1-108"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span></span>
<span id="cb1-109"><a href="#cb1-109"></a>    <span class="kw">const</span> move_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> x,</span>
<span id="cb1-110"><a href="#cb1-110"></a>    <span class="kw">const</span> move_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb1-111"><a href="#cb1-111"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator1, <span class="kw">class</span> Iterator2<span class="op">&gt;</span></span>
<span id="cb1-112"><a href="#cb1-112"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">!=(</span></span>
<span id="cb1-113"><a href="#cb1-113"></a>    <span class="kw">const</span> move_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> x,</span>
<span id="cb1-114"><a href="#cb1-114"></a>    <span class="kw">const</span> move_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb1-115"><a href="#cb1-115"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator1, <span class="kw">class</span> Iterator2<span class="op">&gt;</span></span>
<span id="cb1-116"><a href="#cb1-116"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&lt;(</span></span>
<span id="cb1-117"><a href="#cb1-117"></a>    <span class="kw">const</span> move_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> x,</span>
<span id="cb1-118"><a href="#cb1-118"></a>    <span class="kw">const</span> move_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb1-119"><a href="#cb1-119"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator1, <span class="kw">class</span> Iterator2<span class="op">&gt;</span></span>
<span id="cb1-120"><a href="#cb1-120"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&gt;(</span></span>
<span id="cb1-121"><a href="#cb1-121"></a>    <span class="kw">const</span> move_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> x,</span>
<span id="cb1-122"><a href="#cb1-122"></a>    <span class="kw">const</span> move_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb1-123"><a href="#cb1-123"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator1, <span class="kw">class</span> Iterator2<span class="op">&gt;</span></span>
<span id="cb1-124"><a href="#cb1-124"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&lt;=(</span></span>
<span id="cb1-125"><a href="#cb1-125"></a>    <span class="kw">const</span> move_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> x,</span>
<span id="cb1-126"><a href="#cb1-126"></a>    <span class="kw">const</span> move_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb1-127"><a href="#cb1-127"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator1, <span class="kw">class</span> Iterator2<span class="op">&gt;</span></span>
<span id="cb1-128"><a href="#cb1-128"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">&gt;=(</span></span>
<span id="cb1-129"><a href="#cb1-129"></a>    <span class="kw">const</span> move_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> x,</span>
<span id="cb1-130"><a href="#cb1-130"></a>    <span class="kw">const</span> move_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb1-131"><a href="#cb1-131"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator1, three_way_comparable_with<span class="op">&lt;</span>Iterator1<span class="op">&gt;</span> Iterator2<span class="op">&gt;</span></span>
<span id="cb1-132"><a href="#cb1-132"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> compare_three_way_result_t<span class="op">&lt;</span>Iterator1, Iterator2<span class="op">&gt;</span></span>
<span id="cb1-133"><a href="#cb1-133"></a>    <span class="kw">operator</span><span class="op">&lt;=&gt;(</span><span class="kw">const</span> move_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> x,</span>
<span id="cb1-134"><a href="#cb1-134"></a>                <span class="kw">const</span> move_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb1-135"><a href="#cb1-135"></a></span>
<span id="cb1-136"><a href="#cb1-136"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator1, <span class="kw">class</span> Iterator2<span class="op">&gt;</span></span>
<span id="cb1-137"><a href="#cb1-137"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">auto</span> <span class="kw">operator</span><span class="op">-(</span></span>
<span id="cb1-138"><a href="#cb1-138"></a>    <span class="kw">const</span> move_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> x, <span class="kw">const</span> move_iterator<span class="op">&lt;</span>Iterator1<span class="op">&gt;&amp;</span> y<span class="op">)</span></span>
<span id="cb1-139"><a href="#cb1-139"></a>      <span class="op">-&gt;</span> <span class="kw">decltype</span><span class="op">(</span>y<span class="op">.</span>base<span class="op">()</span> <span class="op">-</span> x<span class="op">.</span>base<span class="op">())</span>;</span>
<span id="cb1-140"><a href="#cb1-140"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator<span class="op">&gt;</span></span>
<span id="cb1-141"><a href="#cb1-141"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> move_iterator<span class="op">&lt;</span>Iterator<span class="op">&gt;</span></span>
<span id="cb1-142"><a href="#cb1-142"></a>    <span class="kw">operator</span><span class="op">+(</span>iter_difference_t<span class="op">&lt;</span>Iterator<span class="op">&gt;</span> n, <span class="kw">const</span> move_iterator<span class="op">&lt;</span>Iterator<span class="op">&gt;&amp;</span> x<span class="op">)</span>;</span>
<span id="cb1-143"><a href="#cb1-143"></a></span>
<span id="cb1-144"><a href="#cb1-144"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator<span class="op">&gt;</span></span>
<span id="cb1-145"><a href="#cb1-145"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> move_iterator<span class="op">&lt;</span>Iterator<span class="op">&gt;</span> make_move_iterator<span class="op">(</span>Iterator i<span class="op">)</span>;</span>
<span id="cb1-146"><a href="#cb1-146"></a></span>
<span id="cb1-147"><a href="#cb1-147"></a><span class="op">...</span></span>
<span id="cb1-148"><a href="#cb1-148"></a></span>
<span id="cb1-149"><a href="#cb1-149"></a><span class="co">// [stream.iterators], stream iterators</span></span>
<span id="cb1-150"><a href="#cb1-150"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> T, <span class="kw">class</span> charT <span class="op">=</span> <span class="dt">char</span>, <span class="kw">class</span> traits <span class="op">=</span> char_traits<span class="op">&lt;</span>charT<span class="op">&gt;</span>,</span>
<span id="cb1-151"><a href="#cb1-151"></a>         <span class="kw">class</span> Distance <span class="op">=</span> <span class="dt">ptrdiff_t</span><span class="op">&gt;</span></span>
<span id="cb1-152"><a href="#cb1-152"></a>  <span class="kw">class</span> istream_iterator;</span>
<span id="cb1-153"><a href="#cb1-153"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> T, <span class="kw">class</span> charT, <span class="kw">class</span> traits, <span class="kw">class</span> Distance<span class="op">&gt;</span></span>
<span id="cb1-154"><a href="#cb1-154"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> istream_iterator<span class="op">&lt;</span>T,charT,traits,Distance<span class="op">&gt;&amp;</span> x,</span>
<span id="cb1-155"><a href="#cb1-155"></a>                                            <span class="kw">const</span> istream_iterator<span class="op">&lt;</span>T,charT,traits,Distance<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb1-156"><a href="#cb1-156"></a></span>
<span id="cb1-157"><a href="#cb1-157"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> T, <span class="kw">class</span> charT <span class="op">=</span> <span class="dt">char</span>, <span class="kw">class</span> traits <span class="op">=</span> char_traits<span class="op">&lt;</span>charT<span class="op">&gt;</span>,</span>
<span id="cb1-158"><a href="#cb1-158"></a>         <span class="kw">class</span> Distance <span class="op">=</span> <span class="dt">ptrdiff_t</span><span class="op">&gt;</span></span>
<span id="cb1-159"><a href="#cb1-159"></a>  <span class="kw">class</span> ostream_iterator;</span>
<span id="cb1-160"><a href="#cb1-160"></a></span>
<span id="cb1-161"><a href="#cb1-161"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> charT <span class="op">=</span> <span class="dt">char</span>, <span class="kw">class</span> traits <span class="op">=</span> char_traits<span class="op">&lt;</span>charT<span class="op">&gt;&gt;</span></span>
<span id="cb1-162"><a href="#cb1-162"></a>  <span class="kw">class</span> istreambuf_iterator;</span>
<span id="cb1-163"><a href="#cb1-163"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> T, <span class="kw">class</span> charT, <span class="kw">class</span> traits, <span class="kw">class</span> Distance<span class="op">&gt;</span></span>
<span id="cb1-164"><a href="#cb1-164"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> istreambuf_iterator<span class="op">&lt;</span>charT,traits<span class="op">&gt;&amp;</span> a,</span>
<span id="cb1-165"><a href="#cb1-165"></a>                                            <span class="kw">const</span> istreambuf_iterator<span class="op">&lt;</span>charT,traits<span class="op">&gt;&amp;</span> b<span class="op">)</span>;</span>
<span id="cb1-166"><a href="#cb1-166"></a></span>
<span id="cb1-167"><a href="#cb1-167"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> T, <span class="kw">class</span> charT <span class="op">=</span> <span class="dt">char</span>, <span class="kw">class</span> traits <span class="op">=</span> char_traits<span class="op">&lt;</span>charT<span class="op">&gt;</span>,</span>
<span id="cb1-168"><a href="#cb1-168"></a>         <span class="kw">class</span> Distance <span class="op">=</span> <span class="dt">ptrdiff_t</span><span class="op">&gt;</span></span>
<span id="cb1-169"><a href="#cb1-169"></a>  <span class="kw">class</span> ostreambuf_iterator;</span>
<span id="cb1-170"><a href="#cb1-170"></a></span>
<span id="cb1-171"><a href="#cb1-171"></a><span class="co">// [iterator.range], range.access</span></span>
<span id="cb1-172"><a href="#cb1-172"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> C<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">auto</span> begin<span class="op">(</span>C<span class="op">&amp;</span> c<span class="op">)</span> <span class="op">-&gt;</span> <span class="kw">decltype</span><span class="op">(</span>c<span class="op">.</span>begin<span class="op">())</span>;</span>
<span id="cb1-173"><a href="#cb1-173"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> C<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">auto</span> begin<span class="op">(</span><span class="kw">const</span> C<span class="op">&amp;</span> c<span class="op">)</span> <span class="op">-&gt;</span> <span class="kw">decltype</span><span class="op">(</span>c<span class="op">.</span>begin<span class="op">())</span>;</span>
<span id="cb1-174"><a href="#cb1-174"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> C<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">auto</span> end<span class="op">(</span>C<span class="op">&amp;</span> c<span class="op">)</span> <span class="op">-&gt;</span> <span class="kw">decltype</span><span class="op">(</span>c<span class="op">.</span>end<span class="op">())</span>;</span>
<span id="cb1-175"><a href="#cb1-175"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> C<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">auto</span> end<span class="op">(</span><span class="kw">const</span> C<span class="op">&amp;</span> c<span class="op">)</span> <span class="op">-&gt;</span> <span class="kw">decltype</span><span class="op">(</span>c<span class="op">.</span>end<span class="op">())</span>;</span>
<span id="cb1-176"><a href="#cb1-176"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> T, <span class="dt">size_t</span> N<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> T<span class="op">*</span> begin<span class="op">(</span>T <span class="op">(&amp;</span>array<span class="op">)[</span>N<span class="op">])</span> <span class="kw">noexcept</span>;</span>
<span id="cb1-177"><a href="#cb1-177"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> T, <span class="dt">size_t</span> N<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> T<span class="op">*</span> end<span class="op">(</span>T <span class="op">(&amp;</span>array<span class="op">)[</span>N<span class="op">])</span> <span class="kw">noexcept</span>;</span>
<span id="cb1-178"><a href="#cb1-178"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> C<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">auto</span> cbegin<span class="op">(</span><span class="kw">const</span> C<span class="op">&amp;</span> c<span class="op">)</span> <span class="kw">noexcept</span><span class="op">(</span><span class="kw">noexcept</span><span class="op">(</span>std<span class="op">::</span>begin<span class="op">(</span>c<span class="op">)))</span></span>
<span id="cb1-179"><a href="#cb1-179"></a>  <span class="op">-&gt;</span> <span class="kw">decltype</span><span class="op">(</span>std<span class="op">::</span>begin<span class="op">(</span>c<span class="op">))</span>;</span>
<span id="cb1-180"><a href="#cb1-180"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> C<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">auto</span> cend<span class="op">(</span><span class="kw">const</span> C<span class="op">&amp;</span> c<span class="op">)</span> <span class="kw">noexcept</span><span class="op">(</span><span class="kw">noexcept</span><span class="op">(</span>std<span class="op">::</span>end<span class="op">(</span>c<span class="op">)))</span></span>
<span id="cb1-181"><a href="#cb1-181"></a>  <span class="op">-&gt;</span> <span class="kw">decltype</span><span class="op">(</span>std<span class="op">::</span>end<span class="op">(</span>c<span class="op">))</span>;</span>
<span id="cb1-182"><a href="#cb1-182"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> C<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">auto</span> rbegin<span class="op">(</span>C<span class="op">&amp;</span> c<span class="op">)</span> <span class="op">-&gt;</span> <span class="kw">decltype</span><span class="op">(</span>c<span class="op">.</span>rbegin<span class="op">())</span>;</span>
<span id="cb1-183"><a href="#cb1-183"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> C<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">auto</span> rbegin<span class="op">(</span><span class="kw">const</span> C<span class="op">&amp;</span> c<span class="op">)</span> <span class="op">-&gt;</span> <span class="kw">decltype</span><span class="op">(</span>c<span class="op">.</span>rbegin<span class="op">())</span>;</span>
<span id="cb1-184"><a href="#cb1-184"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> C<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">auto</span> rend<span class="op">(</span>C<span class="op">&amp;</span> c<span class="op">)</span> <span class="op">-&gt;</span> <span class="kw">decltype</span><span class="op">(</span>c<span class="op">.</span>rend<span class="op">())</span>;</span>
<span id="cb1-185"><a href="#cb1-185"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> C<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">auto</span> rend<span class="op">(</span><span class="kw">const</span> C<span class="op">&amp;</span> c<span class="op">)</span> <span class="op">-&gt;</span> <span class="kw">decltype</span><span class="op">(</span>c<span class="op">.</span>rend<span class="op">())</span>;</span>
<span id="cb1-186"><a href="#cb1-186"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> T, <span class="dt">size_t</span> N<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> reverse_iterator<span class="op">&lt;</span>T<span class="op">*&gt;</span> begin<span class="op">(</span>T <span class="op">(&amp;</span>array<span class="op">)[</span>N<span class="op">])</span> <span class="kw">noexcept</span>;</span>
<span id="cb1-187"><a href="#cb1-187"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> T, <span class="dt">size_t</span> N<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> reverse_iterator<span class="op">&lt;</span>T<span class="op">*&gt;</span> end<span class="op">(</span>T <span class="op">(&amp;</span>array<span class="op">)[</span>N<span class="op">])</span> <span class="kw">noexcept</span>;</span>
<span id="cb1-188"><a href="#cb1-188"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> E<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> reverse_iterator<span class="op">&lt;</span><span class="kw">const</span> E<span class="op">*&gt;</span> begin<span class="op">(</span>initializer_list<span class="op">&lt;</span>E<span class="op">&gt;</span> il<span class="op">)</span> <span class="kw">noexcept</span>;</span>
<span id="cb1-189"><a href="#cb1-189"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> E<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> reverse_iterator<span class="op">&lt;</span><span class="kw">const</span> E<span class="op">*&gt;</span> end<span class="op">(</span>initializer_list<span class="op">&lt;</span>E<span class="op">&gt;</span> il<span class="op">)</span> <span class="kw">noexcept</span>;</span>
<span id="cb1-190"><a href="#cb1-190"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> C<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">auto</span> crbegin<span class="op">(</span><span class="kw">const</span> C<span class="op">&amp;</span> c<span class="op">)</span> <span class="kw">noexcept</span><span class="op">(</span><span class="kw">noexcept</span><span class="op">(</span>std<span class="op">::</span>rbegin<span class="op">(</span>c<span class="op">)))</span></span>
<span id="cb1-191"><a href="#cb1-191"></a>  <span class="op">-&gt;</span> <span class="kw">decltype</span><span class="op">(</span>std<span class="op">::</span>begin<span class="op">(</span>c<span class="op">))</span>;</span>
<span id="cb1-192"><a href="#cb1-192"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> C<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">auto</span> crend<span class="op">(</span><span class="kw">const</span> C<span class="op">&amp;</span> c<span class="op">)</span> <span class="kw">noexcept</span><span class="op">(</span><span class="kw">noexcept</span><span class="op">(</span>std<span class="op">::</span>rend<span class="op">(</span>c<span class="op">)))</span></span>
<span id="cb1-193"><a href="#cb1-193"></a>  <span class="op">-&gt;</span> <span class="kw">decltype</span><span class="op">(</span>std<span class="op">::</span>end<span class="op">(</span>c<span class="op">))</span>;</span>
<span id="cb1-194"><a href="#cb1-194"></a></span>
<span id="cb1-195"><a href="#cb1-195"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> C<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">auto</span> size<span class="op">(</span><span class="kw">const</span> C<span class="op">&amp;</span> c<span class="op">)</span> <span class="op">-&gt;</span> <span class="kw">decltype</span><span class="op">(</span>c<span class="op">.</span>size<span class="op">())</span>;</span>
<span id="cb1-196"><a href="#cb1-196"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> T, <span class="dt">size_t</span> N<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="dt">size_t</span> size<span class="op">(</span><span class="kw">const</span> T <span class="op">(&amp;</span>array<span class="op">)[</span>N<span class="op">])</span> <span class="kw">noexcept</span>;</span>
<span id="cb1-197"><a href="#cb1-197"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> C<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">auto</span> ssize<span class="op">(</span><span class="kw">const</span> C<span class="op">&amp;</span> c<span class="op">)</span></span>
<span id="cb1-198"><a href="#cb1-198"></a>  <span class="op">-&gt;</span> common_type_t<span class="op">&lt;</span><span class="dt">ptrdiff_t</span>, make_signed_t<span class="op">&lt;</span><span class="kw">decltype</span><span class="op">(</span>c<span class="op">.</span>size<span class="op">())&gt;&gt;</span>;</span>
<span id="cb1-199"><a href="#cb1-199"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> T, <span class="dt">ptrdiff_t</span> N<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="dt">ptrdiff_t</span> ssize<span class="op">(</span><span class="kw">const</span> T <span class="op">(&amp;</span>array<span class="op">)[</span>N<span class="op">])</span> <span class="kw">noexcept</span>;</span>
<span id="cb1-200"><a href="#cb1-200"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> C<span class="op">&gt;</span> <span class="op">[[</span><span class="at">nodiscard</span><span class="op">]]</span> <span class="kw">constexpr</span> <span class="kw">auto</span> empty<span class="op">(</span><span class="kw">const</span> C<span class="op">&amp;</span> c<span class="op">)</span> <span class="op">-&gt;</span> <span class="kw">decltype</span><span class="op">(</span>c<span class="op">.</span>empty<span class="op">())</span>;</span>
<span id="cb1-201"><a href="#cb1-201"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> T, <span class="dt">size_t</span> N<span class="op">&gt;</span> <span class="op">[[</span><span class="at">nodiscard</span><span class="op">]]</span> <span class="kw">constexpr</span> <span class="dt">bool</span> empty<span class="op">(</span><span class="kw">const</span> T <span class="op">(&amp;</span>array<span class="op">)[</span>N<span class="op">])</span> <span class="kw">noexcept</span>;</span>
<span id="cb1-202"><a href="#cb1-202"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> E<span class="op">&gt;</span> <span class="op">[[</span><span class="at">nodiscard</span><span class="op">]]</span> <span class="kw">constexpr</span> <span class="dt">bool</span> empty<span class="op">(</span>initializer_list<span class="op">&lt;</span>E<span class="op">&gt;</span> il<span class="op">)</span> <span class="kw">noexcept</span>;</span>
<span id="cb1-203"><a href="#cb1-203"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> C<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">auto</span> data<span class="op">(</span>C<span class="op">&amp;</span> c<span class="op">)</span> <span class="op">-&gt;</span> <span class="kw">decltype</span><span class="op">(</span>c<span class="op">.</span>data<span class="op">())</span>;</span>
<span id="cb1-204"><a href="#cb1-204"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> C<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">auto</span> data<span class="op">(</span><span class="kw">const</span> C<span class="op">&amp;</span> c<span class="op">)</span> <span class="op">-&gt;</span> <span class="kw">decltype</span><span class="op">(</span>c<span class="op">.</span>data<span class="op">())</span>;</span>
<span id="cb1-205"><a href="#cb1-205"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> T, <span class="dt">size_t</span> N<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> T<span class="op">*</span> data<span class="op">(</span>T <span class="op">(&amp;</span>array<span class="op">)[</span>N<span class="op">])</span> <span class="kw">noexcept</span>;</span>
<span id="cb1-206"><a href="#cb1-206"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> E<span class="op">&gt;</span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">const</span> E<span class="op">*</span> data<span class="op">(</span>initializer_list<span class="op">&lt;</span>E<span class="op">&gt;</span> il<span class="op">)</span> <span class="kw">noexcept</span>;</span></code></pre></div>
<h2 data-number="6.3" id="class-template-reverse_iterator-reverse.iterator"><span class="header-section-number">6.3</span> Class template <code class="sourceCode default">reverse_iterator</code> [reverse.iterator]<a href="#class-template-reverse_iterator-reverse.iterator" class="self-link"></a></h2>
<div class="sourceCode" id="cb2"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb2-1"><a href="#cb2-1"></a><span class="kw">namespace</span> std <span class="op">{</span></span>
<span id="cb2-2"><a href="#cb2-2"></a>  <span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator<span class="op">&gt;</span></span>
<span id="cb2-3"><a href="#cb2-3"></a>  <span class="kw">class</span> reverse_iterator <span class="op">{</span></span>
<span id="cb2-4"><a href="#cb2-4"></a>  <span class="kw">public</span><span class="op">:</span></span>
<span id="cb2-5"><a href="#cb2-5"></a>    <span class="op">...</span></span>
<span id="cb2-6"><a href="#cb2-6"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> Iterator base<span class="op">()</span> <span class="kw">const</span>;</span>
<span id="cb2-7"><a href="#cb2-7"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> reference <span class="kw">operator</span><span class="op">*()</span> <span class="kw">const</span>;</span>
<span id="cb2-8"><a href="#cb2-8"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> pointer <span class="kw">operator</span><span class="op">-&gt;()</span> <span class="kw">const</span> <span class="kw">requires</span> <em>see below</em>;</span>
<span id="cb2-9"><a href="#cb2-9"></a></span>
<span id="cb2-10"><a href="#cb2-10"></a>    <span class="kw">constexpr</span> reverse_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">++()</span>;</span>
<span id="cb2-11"><a href="#cb2-11"></a>    <span class="kw">constexpr</span> reverse_iterator <span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span>;</span>
<span id="cb2-12"><a href="#cb2-12"></a>    <span class="kw">constexpr</span> reverse_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">--()</span>;</span>
<span id="cb2-13"><a href="#cb2-13"></a>    <span class="kw">constexpr</span> reverse_iterator <span class="kw">operator</span><span class="op">--(</span><span class="dt">int</span><span class="op">)</span>;</span>
<span id="cb2-14"><a href="#cb2-14"></a></span>
<span id="cb2-15"><a href="#cb2-15"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> reverse_iterator <span class="kw">operator</span><span class="op">+(</span>difference_type n<span class="op">)</span> <span class="kw">const</span>;</span>
<span id="cb2-16"><a href="#cb2-16"></a>    <span class="kw">constexpr</span> reverse_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">+=(</span>difference_type n<span class="op">)</span>;</span>
<span id="cb2-17"><a href="#cb2-17"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> reverse_iterator <span class="kw">operator</span><span class="op">-(</span>difference_type n<span class="op">)</span> <span class="kw">const</span>;</span>
<span id="cb2-18"><a href="#cb2-18"></a>    <span class="kw">constexpr</span> reverse_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">-=(</span>difference_type n<span class="op">)</span>;</span>
<span id="cb2-19"><a href="#cb2-19"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <em>unspecified</em> <span class="kw">operator</span><span class="op">[](</span>difference_type n<span class="op">)</span> <span class="kw">const</span>;</span>
<span id="cb2-20"><a href="#cb2-20"></a></span>
<span id="cb2-21"><a href="#cb2-21"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">friend</span> <span class="kw">constexpr</span> iter_rvalue_reference_t<span class="op">&lt;</span>Iterator<span class="op">&gt;</span></span>
<span id="cb2-22"><a href="#cb2-22"></a>      iter_move<span class="op">(</span><span class="kw">const</span> reverse_iterator<span class="op">&amp;</span> i<span class="op">)</span> <span class="kw">noexcept</span><span class="op">(</span><em>see below</em><span class="op">)</span>;</span>
<span id="cb2-23"><a href="#cb2-23"></a>    <span class="op">...</span></span>
<span id="cb2-24"><a href="#cb2-24"></a>  <span class="op">}</span>;</span>
<span id="cb2-25"><a href="#cb2-25"></a><span class="op">}</span></span></code></pre></div>
<h2 data-number="6.4" id="class-template-back_insert_iterator-back.insert.iterator"><span class="header-section-number">6.4</span> Class template <code class="sourceCode default">back_insert_iterator</code> [back.insert.iterator]<a href="#class-template-back_insert_iterator-back.insert.iterator" class="self-link"></a></h2>
<div class="sourceCode" id="cb3"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb3-1"><a href="#cb3-1"></a><span class="kw">namespace</span> std <span class="op">{</span></span>
<span id="cb3-2"><a href="#cb3-2"></a>  <span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Container<span class="op">&gt;</span></span>
<span id="cb3-3"><a href="#cb3-3"></a>  <span class="kw">class</span> back_insert_iterator <span class="op">{</span></span>
<span id="cb3-4"><a href="#cb3-4"></a>    <span class="op">...</span></span>
<span id="cb3-5"><a href="#cb3-5"></a></span>
<span id="cb3-6"><a href="#cb3-6"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> back_insert_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">*()</span>;</span>
<span id="cb3-7"><a href="#cb3-7"></a>    <span class="kw">constexpr</span> back_insert_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">++()</span>;</span>
<span id="cb3-8"><a href="#cb3-8"></a>    <span class="kw">constexpr</span> back_insert_iterator <span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span>;</span>
<span id="cb3-9"><a href="#cb3-9"></a>  <span class="op">}</span>;</span>
<span id="cb3-10"><a href="#cb3-10"></a><span class="op">}</span></span></code></pre></div>
<h2 data-number="6.5" id="class-template-front_insert_iterator-front.insert.iterator"><span class="header-section-number">6.5</span> Class template <code class="sourceCode default">front_insert_iterator</code> [front.insert.iterator]<a href="#class-template-front_insert_iterator-front.insert.iterator" class="self-link"></a></h2>
<div class="sourceCode" id="cb4"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb4-1"><a href="#cb4-1"></a><span class="kw">namespace</span> std <span class="op">{</span></span>
<span id="cb4-2"><a href="#cb4-2"></a>  <span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Container<span class="op">&gt;</span></span>
<span id="cb4-3"><a href="#cb4-3"></a>  <span class="kw">class</span> front_insert_iterator <span class="op">{</span></span>
<span id="cb4-4"><a href="#cb4-4"></a>    <span class="op">...</span></span>
<span id="cb4-5"><a href="#cb4-5"></a></span>
<span id="cb4-6"><a href="#cb4-6"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> front_insert_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">*()</span>;</span>
<span id="cb4-7"><a href="#cb4-7"></a>    <span class="kw">constexpr</span> front_insert_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">++()</span>;</span>
<span id="cb4-8"><a href="#cb4-8"></a>    <span class="kw">constexpr</span> front_insert_iterator <span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span>;</span>
<span id="cb4-9"><a href="#cb4-9"></a>  <span class="op">}</span>;</span>
<span id="cb4-10"><a href="#cb4-10"></a><span class="op">}</span></span></code></pre></div>
<h2 data-number="6.6" id="class-template-insert_iterator-insert.iterator"><span class="header-section-number">6.6</span> Class template <code class="sourceCode default">insert_iterator</code> [insert.iterator]<a href="#class-template-insert_iterator-insert.iterator" class="self-link"></a></h2>
<div class="sourceCode" id="cb5"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb5-1"><a href="#cb5-1"></a><span class="kw">namespace</span> std <span class="op">{</span></span>
<span id="cb5-2"><a href="#cb5-2"></a>  <span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Container<span class="op">&gt;</span></span>
<span id="cb5-3"><a href="#cb5-3"></a>  <span class="kw">class</span> insert_iterator <span class="op">{</span></span>
<span id="cb5-4"><a href="#cb5-4"></a>    <span class="op">...</span></span>
<span id="cb5-5"><a href="#cb5-5"></a></span>
<span id="cb5-6"><a href="#cb5-6"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> insert_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">*()</span>;</span>
<span id="cb5-7"><a href="#cb5-7"></a>    <span class="kw">constexpr</span> insert_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">++()</span>;</span>
<span id="cb5-8"><a href="#cb5-8"></a>    <span class="kw">constexpr</span> insert_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span>;</span>
<span id="cb5-9"><a href="#cb5-9"></a>  <span class="op">}</span>;</span>
<span id="cb5-10"><a href="#cb5-10"></a><span class="op">}</span></span></code></pre></div>
<h1 data-number="7" id="class-template-move_iterator-move.iterator"><span class="header-section-number">7</span> Class template <code class="sourceCode default">move_iterator</code> [move.iterator]<a href="#class-template-move_iterator-move.iterator" class="self-link"></a></h1>
<div class="sourceCode" id="cb6"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb6-1"><a href="#cb6-1"></a><span class="kw">namespace</span> std <span class="op">{</span></span>
<span id="cb6-2"><a href="#cb6-2"></a>  <span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Iterator<span class="op">&gt;</span></span>
<span id="cb6-3"><a href="#cb6-3"></a>  <span class="kw">class</span> move_iterator <span class="op">{</span></span>
<span id="cb6-4"><a href="#cb6-4"></a>  <span class="kw">public</span><span class="op">:</span></span>
<span id="cb6-5"><a href="#cb6-5"></a>    <span class="op">...</span></span>
<span id="cb6-6"><a href="#cb6-6"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">const</span> iterator_type<span class="op">&amp;</span> base<span class="op">()</span> <span class="kw">const</span> <span class="op">&amp;</span>;</span>
<span id="cb6-7"><a href="#cb6-7"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> iterator_type base<span class="op">()</span> <span class="op">&amp;&amp;</span>;</span>
<span id="cb6-8"><a href="#cb6-8"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> reference <span class="kw">operator</span><span class="op">*()</span> <span class="kw">const</span>;</span>
<span id="cb6-9"><a href="#cb6-9"></a></span>
<span id="cb6-10"><a href="#cb6-10"></a>    <span class="kw">constexpr</span> move_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">++()</span>;</span>
<span id="cb6-11"><a href="#cb6-11"></a>    <span class="kw">constexpr</span> <span class="kw">auto</span> <span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span>;</span>
<span id="cb6-12"><a href="#cb6-12"></a>    <span class="kw">constexpr</span> move_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">--()</span>;</span>
<span id="cb6-13"><a href="#cb6-13"></a>    <span class="kw">constexpr</span> move_iterator <span class="kw">operator</span><span class="op">--(</span><span class="dt">int</span><span class="op">)</span>;</span>
<span id="cb6-14"><a href="#cb6-14"></a></span>
<span id="cb6-15"><a href="#cb6-15"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> move_iterator <span class="kw">operator</span><span class="op">+(</span>difference_type n<span class="op">)</span> <span class="kw">const</span>;</span>
<span id="cb6-16"><a href="#cb6-16"></a>    <span class="kw">constexpr</span> move_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">+=(</span>difference_type n<span class="op">)</span>;</span>
<span id="cb6-17"><a href="#cb6-17"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> move_iterator <span class="kw">operator</span><span class="op">-(</span>difference_type n<span class="op">)</span> <span class="kw">const</span>;</span>
<span id="cb6-18"><a href="#cb6-18"></a>    <span class="kw">constexpr</span> move_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">-=(</span>difference_type n<span class="op">)</span>;</span>
<span id="cb6-19"><a href="#cb6-19"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> reference <span class="kw">operator</span><span class="op">[](</span>difference_type n<span class="op">)</span> <span class="kw">const</span>;</span>
<span id="cb6-20"><a href="#cb6-20"></a></span>
<span id="cb6-21"><a href="#cb6-21"></a>    <span class="kw">template</span><span class="op">&lt;</span>sentinel_for<span class="op">&lt;</span>Iterator<span class="op">&gt;</span> S<span class="op">&gt;</span></span>
<span id="cb6-22"><a href="#cb6-22"></a>      <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span></span>
<span id="cb6-23"><a href="#cb6-23"></a>        <span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> move_iterator<span class="op">&amp;</span> x, <span class="kw">const</span> move_sentinel<span class="op">&lt;</span>S<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb6-24"><a href="#cb6-24"></a>    <span class="kw">template</span><span class="op">&lt;</span>sized_sentinel_for<span class="op">&lt;</span>Iterator<span class="op">&gt;</span> S<span class="op">&gt;</span></span>
<span id="cb6-25"><a href="#cb6-25"></a>      <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">friend</span> <span class="kw">constexpr</span> iter_difference_t<span class="op">&lt;</span>Iterator<span class="op">&gt;</span></span>
<span id="cb6-26"><a href="#cb6-26"></a>        <span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> move_sentinel<span class="op">&lt;</span>S<span class="op">&gt;&amp;</span> x, <span class="kw">const</span> move_iterator<span class="op">&amp;</span> y<span class="op">)</span>;</span>
<span id="cb6-27"><a href="#cb6-27"></a>    <span class="kw">template</span><span class="op">&lt;</span>sized_sentinel_for<span class="op">&lt;</span>Iterator<span class="op">&gt;</span> S<span class="op">&gt;</span></span>
<span id="cb6-28"><a href="#cb6-28"></a>      <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">friend</span> <span class="kw">constexpr</span> iter_difference_t<span class="op">&lt;</span>Iterator<span class="op">&gt;</span></span>
<span id="cb6-29"><a href="#cb6-29"></a>        <span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> move_iterator<span class="op">&amp;</span> x, <span class="kw">const</span> move_sentinel<span class="op">&lt;</span>S<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb6-30"><a href="#cb6-30"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">friend</span> <span class="kw">constexpr</span> iter_rvalue_reference_t<span class="op">&lt;</span>Iterator<span class="op">&gt;</span></span>
<span id="cb6-31"><a href="#cb6-31"></a>      iter_move<span class="op">(</span><span class="kw">const</span> move_iterator<span class="op">&amp;</span> i<span class="op">)</span> <span class="kw">noexcept</span><span class="op">(</span><em>see below</em><span class="op">)</span>;</span>
<span id="cb6-32"><a href="#cb6-32"></a>    <span class="op">...</span></span>
<span id="cb6-33"><a href="#cb6-33"></a>  <span class="op">}</span>;</span>
<span id="cb6-34"><a href="#cb6-34"></a><span class="op">}</span></span></code></pre></div>
<h2 data-number="7.1" id="class-template-move_sentinel-move.sentinel"><span class="header-section-number">7.1</span> Class template <code class="sourceCode default">move_sentinel</code> [move.sentinel]<a href="#class-template-move_sentinel-move.sentinel" class="self-link"></a></h2>
<div class="sourceCode" id="cb7"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb7-1"><a href="#cb7-1"></a><span class="kw">namespace</span> std <span class="op">{</span></span>
<span id="cb7-2"><a href="#cb7-2"></a>  <span class="kw">template</span><span class="op">&lt;</span>semiregular S<span class="op">&gt;</span></span>
<span id="cb7-3"><a href="#cb7-3"></a>  <span class="kw">class</span> move_sentinel <span class="op">{</span></span>
<span id="cb7-4"><a href="#cb7-4"></a>  <span class="kw">public</span><span class="op">:</span></span>
<span id="cb7-5"><a href="#cb7-5"></a>    <span class="op">...</span></span>
<span id="cb7-6"><a href="#cb7-6"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> S base<span class="op">()</span> <span class="kw">const</span>;</span>
<span id="cb7-7"><a href="#cb7-7"></a>    <span class="op">...</span></span>
<span id="cb7-8"><a href="#cb7-8"></a>  <span class="op">}</span>;</span>
<span id="cb7-9"><a href="#cb7-9"></a><span class="op">}</span></span></code></pre></div>
<h2 data-number="7.2" id="class-template-common_iterator-common.iterator"><span class="header-section-number">7.2</span> Class template <code class="sourceCode default">common_iterator</code> [common.iterator]<a href="#class-template-common_iterator-common.iterator" class="self-link"></a></h2>
<div class="sourceCode" id="cb8"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb8-1"><a href="#cb8-1"></a><span class="kw">namespace</span> std <span class="op">{</span></span>
<span id="cb8-2"><a href="#cb8-2"></a>  <span class="kw">template</span><span class="op">&lt;</span>input_or_output_iterator I, sentinel_for<span class="op">&lt;</span>I<span class="op">&gt;</span> S<span class="op">&gt;</span></span>
<span id="cb8-3"><a href="#cb8-3"></a>    <span class="kw">requires</span> <span class="op">(!</span>same_as<span class="op">&lt;</span>I, S<span class="op">&gt;</span> <span class="op">&amp;&amp;</span> copyable<span class="op">&lt;</span>I<span class="op">&gt;)</span></span>
<span id="cb8-4"><a href="#cb8-4"></a>  <span class="kw">class</span> common_iterator <span class="op">{</span></span>
<span id="cb8-5"><a href="#cb8-5"></a>  <span class="kw">public</span><span class="op">:</span></span>
<span id="cb8-6"><a href="#cb8-6"></a>    <span class="op">...</span></span>
<span id="cb8-7"><a href="#cb8-7"></a></span>
<span id="cb8-8"><a href="#cb8-8"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">decltype</span><span class="op">(</span><span class="kw">auto</span><span class="op">)</span> <span class="kw">operator</span><span class="op">*()</span>;</span>
<span id="cb8-9"><a href="#cb8-9"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">decltype</span><span class="op">(</span><span class="kw">auto</span><span class="op">)</span> <span class="kw">operator</span><span class="op">*()</span> <span class="kw">const</span></span>
<span id="cb8-10"><a href="#cb8-10"></a>      <span class="kw">requires</span> <em>dereferenceable</em><span class="op">&lt;</span><span class="kw">const</span> I<span class="op">&gt;</span>;</span>
<span id="cb8-11"><a href="#cb8-11"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">decltype</span><span class="op">(</span><span class="kw">auto</span><span class="op">)</span> <span class="kw">operator</span><span class="op">-&gt;()</span> <span class="kw">const</span></span>
<span id="cb8-12"><a href="#cb8-12"></a>      <span class="kw">requires</span> <em>see below</em>;</span>
<span id="cb8-13"><a href="#cb8-13"></a></span>
<span id="cb8-14"><a href="#cb8-14"></a>    common_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">++()</span>;</span>
<span id="cb8-15"><a href="#cb8-15"></a>    <span class="kw">decltype</span><span class="op">(</span><span class="kw">auto</span><span class="op">)</span> <span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span>;</span>
<span id="cb8-16"><a href="#cb8-16"></a></span>
<span id="cb8-17"><a href="#cb8-17"></a>    <span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> I2, sentinel_for<span class="op">&lt;</span>I<span class="op">&gt;</span> S2<span class="op">&gt;</span></span>
<span id="cb8-18"><a href="#cb8-18"></a>      <span class="kw">requires</span> sentinel_for<span class="op">&lt;</span>S, I2<span class="op">&gt;</span></span>
<span id="cb8-19"><a href="#cb8-19"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">friend</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span></span>
<span id="cb8-20"><a href="#cb8-20"></a>      <span class="kw">const</span> common_iterator<span class="op">&amp;</span> x, <span class="kw">const</span> common_iterator<span class="op">&lt;</span>I2, S2<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb8-21"><a href="#cb8-21"></a>    <span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> I2, sentinel_for<span class="op">&lt;</span>I<span class="op">&gt;</span> S2<span class="op">&gt;</span></span>
<span id="cb8-22"><a href="#cb8-22"></a>      <span class="kw">requires</span> sentinel_for<span class="op">&lt;</span>S, I2<span class="op">&gt;</span> <span class="op">&amp;&amp;</span> equality_comparable_with<span class="op">&lt;</span>I, I2<span class="op">&gt;</span></span>
<span id="cb8-23"><a href="#cb8-23"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">friend</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span></span>
<span id="cb8-24"><a href="#cb8-24"></a>      <span class="kw">const</span> common_iterator<span class="op">&amp;</span> x, <span class="kw">const</span> common_iterator<span class="op">&lt;</span>I2, S2<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb8-25"><a href="#cb8-25"></a></span>
<span id="cb8-26"><a href="#cb8-26"></a>    <span class="kw">template</span><span class="op">&lt;</span>sized_sentinel_for<span class="op">&lt;</span>I<span class="op">&gt;</span> I2, sized_sentinel_for<span class="op">&lt;</span>I<span class="op">&gt;</span> S2<span class="op">&gt;</span></span>
<span id="cb8-27"><a href="#cb8-27"></a>      <span class="kw">requires</span> sized_sentinel_for<span class="op">&lt;</span>S, I2<span class="op">&gt;</span></span>
<span id="cb8-28"><a href="#cb8-28"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">friend</span> iter_difference_t <span class="kw">operator</span><span class="op">-(</span></span>
<span id="cb8-29"><a href="#cb8-29"></a>      <span class="kw">const</span> common_iterator<span class="op">&amp;</span> x, <span class="kw">const</span> common_iterator<span class="op">&lt;</span>I2, S2<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb8-30"><a href="#cb8-30"></a></span>
<span id="cb8-31"><a href="#cb8-31"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">friend</span> iter_rvalue_reference_t<span class="op">&lt;</span>I<span class="op">&gt;</span> iter_move<span class="op">(</span><span class="kw">const</span> common_iterator<span class="op">&amp;</span> i<span class="op">)</span></span>
<span id="cb8-32"><a href="#cb8-32"></a>      <span class="kw">noexcept</span><span class="op">(</span><span class="kw">noexcept</span><span class="op">(</span>ranges<span class="op">::</span>iter_move<span class="op">(</span>declval<span class="op">&lt;</span><span class="kw">const</span> I<span class="op">&amp;&gt;())))</span></span>
<span id="cb8-33"><a href="#cb8-33"></a>        <span class="kw">requires</span> input_iterator<span class="op">&lt;</span>I<span class="op">&gt;</span>;</span>
<span id="cb8-34"><a href="#cb8-34"></a>    <span class="op">...</span></span>
<span id="cb8-35"><a href="#cb8-35"></a>  <span class="op">}</span>;</span>
<span id="cb8-36"><a href="#cb8-36"></a><span class="op">}</span></span></code></pre></div>
<h2 data-number="7.3" id="class-template-counted_iterator-counted.iterator"><span class="header-section-number">7.3</span> Class template <code class="sourceCode default">counted_iterator</code> [counted.iterator]<a href="#class-template-counted_iterator-counted.iterator" class="self-link"></a></h2>
<div class="sourceCode" id="cb9"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb9-1"><a href="#cb9-1"></a><span class="kw">namespace</span> std <span class="op">{</span></span>
<span id="cb9-2"><a href="#cb9-2"></a>  <span class="kw">template</span><span class="op">&lt;</span>input_or_output_iterator I<span class="op">&gt;</span></span>
<span id="cb9-3"><a href="#cb9-3"></a>  <span class="kw">class</span> counted_iterator <span class="op">{</span></span>
<span id="cb9-4"><a href="#cb9-4"></a>  <span class="kw">public</span><span class="op">:</span></span>
<span id="cb9-5"><a href="#cb9-5"></a>    <span class="op">...</span></span>
<span id="cb9-6"><a href="#cb9-6"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">const</span> I<span class="op">&amp;</span> base<span class="op">()</span> <span class="kw">const</span> <span class="op">&amp;</span>;</span>
<span id="cb9-7"><a href="#cb9-7"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> I base<span class="op">()</span> <span class="op">&amp;&amp;</span>;</span>
<span id="cb9-8"><a href="#cb9-8"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> iter_difference_t<span class="op">&lt;</span>I<span class="op">&gt;</span> count<span class="op">()</span> <span class="kw">const</span> <span class="kw">noexcept</span>;</span>
<span id="cb9-9"><a href="#cb9-9"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">decltype</span><span class="op">(</span><span class="kw">auto</span><span class="op">)</span> <span class="kw">operator</span><span class="op">*()</span>;</span>
<span id="cb9-10"><a href="#cb9-10"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">decltype</span><span class="op">(</span><span class="kw">auto</span><span class="op">)</span> <span class="kw">operator</span><span class="op">*()</span> <span class="kw">const</span></span>
<span id="cb9-11"><a href="#cb9-11"></a>      <span class="kw">requires</span> <em>dereferenceable</em><span class="op">&lt;</span><span class="kw">const</span> I<span class="op">&gt;</span>;</span>
<span id="cb9-12"><a href="#cb9-12"></a></span>
<span id="cb9-13"><a href="#cb9-13"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">auto</span> <span class="kw">operator</span><span class="op">-&gt;()</span> <span class="kw">const</span> <span class="kw">noexcept</span></span>
<span id="cb9-14"><a href="#cb9-14"></a>      <span class="kw">requires</span> contiguous_iterator<span class="op">&lt;</span>I<span class="op">&gt;</span>;</span>
<span id="cb9-15"><a href="#cb9-15"></a></span>
<span id="cb9-16"><a href="#cb9-16"></a>    <span class="kw">constexpr</span> counted_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">++()</span>;</span>
<span id="cb9-17"><a href="#cb9-17"></a>    <span class="kw">decltype</span><span class="op">(</span><span class="kw">auto</span><span class="op">)</span> <span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span>;</span>
<span id="cb9-18"><a href="#cb9-18"></a>    <span class="kw">constexpr</span> counted_iterator <span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span></span>
<span id="cb9-19"><a href="#cb9-19"></a>      <span class="kw">requires</span> forward_iterator<span class="op">&lt;</span>I<span class="op">&gt;</span>;</span>
<span id="cb9-20"><a href="#cb9-20"></a>    <span class="kw">constexpr</span> counted_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">--()</span></span>
<span id="cb9-21"><a href="#cb9-21"></a>      <span class="kw">requires</span> bidirectional_iterator<span class="op">&lt;</span>I<span class="op">&gt;</span>;</span>
<span id="cb9-22"><a href="#cb9-22"></a>    <span class="kw">constexpr</span> counted_iterator <span class="kw">operator</span><span class="op">--(</span><span class="dt">int</span><span class="op">)</span></span>
<span id="cb9-23"><a href="#cb9-23"></a>      <span class="kw">requires</span> bidirectional_iterator<span class="op">&lt;</span>I<span class="op">&gt;</span>;</span>
<span id="cb9-24"><a href="#cb9-24"></a></span>
<span id="cb9-25"><a href="#cb9-25"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> counted_iterator <span class="kw">operator</span><span class="op">-(</span>iter_difference_t<span class="op">&lt;</span>I<span class="op">&gt;</span> n<span class="op">)</span> <span class="kw">const</span></span>
<span id="cb9-26"><a href="#cb9-26"></a>      <span class="kw">requires</span> random_access_iterator<span class="op">&lt;</span>I<span class="op">&gt;</span>;</span>
<span id="cb9-27"><a href="#cb9-27"></a>    <span class="kw">template</span><span class="op">&lt;</span>common_with<span class="op">&lt;</span>I<span class="op">&gt;</span> I2<span class="op">&gt;</span></span>
<span id="cb9-28"><a href="#cb9-28"></a>      <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> iter_difference_t<span class="op">&lt;</span>I2<span class="op">&gt;</span> <span class="kw">operator</span><span class="op">-(</span></span>
<span id="cb9-29"><a href="#cb9-29"></a>        <span class="kw">const</span> counted_iterator<span class="op">&amp;</span> x, <span class="kw">const</span> counted_iterator<span class="op">&lt;</span>I2<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb9-30"><a href="#cb9-30"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> iter_difference_t<span class="op">&lt;</span>I2<span class="op">&gt;</span> <span class="kw">operator</span><span class="op">-(</span></span>
<span id="cb9-31"><a href="#cb9-31"></a>      <span class="kw">const</span> counted_iterator<span class="op">&amp;</span> x, default_sentinel_t<span class="op">)</span>;</span>
<span id="cb9-32"><a href="#cb9-32"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> iter_difference_t<span class="op">&lt;</span>I2<span class="op">&gt;</span> <span class="kw">operator</span><span class="op">-(</span></span>
<span id="cb9-33"><a href="#cb9-33"></a>      default_sentinel_t, <span class="kw">const</span> counted_iterator<span class="op">&amp;</span> y<span class="op">)</span>;</span>
<span id="cb9-34"><a href="#cb9-34"></a>    <span class="kw">constexpr</span> counted_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">-=(</span>iter_difference_t<span class="op">&lt;</span>I<span class="op">&gt;</span> n<span class="op">)</span></span>
<span id="cb9-35"><a href="#cb9-35"></a>      <span class="kw">requires</span> random_access_iterator<span class="op">&lt;</span>I<span class="op">&gt;</span>;</span>
<span id="cb9-36"><a href="#cb9-36"></a></span>
<span id="cb9-37"><a href="#cb9-37"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">constexpr</span> <span class="kw">decltype</span><span class="op">(</span><span class="kw">auto</span><span class="op">)</span> <span class="kw">operator</span><span class="op">[](</span>iter_difference_t<span class="op">&lt;</span>I<span class="op">&gt;</span> n<span class="op">)</span> <span class="kw">const</span></span>
<span id="cb9-38"><a href="#cb9-38"></a>      <span class="kw">requires</span> random_access_iterator<span class="op">&lt;</span>I<span class="op">&gt;</span>;</span>
<span id="cb9-39"><a href="#cb9-39"></a></span>
<span id="cb9-40"><a href="#cb9-40"></a>    <span class="kw">template</span><span class="op">&lt;</span>common_with<span class="op">&lt;</span>I<span class="op">&gt;</span> I2<span class="op">&gt;</span></span>
<span id="cb9-41"><a href="#cb9-41"></a>      <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span></span>
<span id="cb9-42"><a href="#cb9-42"></a>        <span class="kw">const</span> counted_iterator<span class="op">&amp;</span> x, <span class="kw">const</span> counted_iterator<span class="op">&lt;</span>I2<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb9-43"><a href="#cb9-43"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">friend</span> <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span></span>
<span id="cb9-44"><a href="#cb9-44"></a>      <span class="kw">const</span> counted_iterator<span class="op">&amp;</span> x, default_sentinel_t<span class="op">)</span>;</span>
<span id="cb9-45"><a href="#cb9-45"></a></span>
<span id="cb9-46"><a href="#cb9-46"></a>    <span class="kw">template</span><span class="op">&lt;</span>common_with<span class="op">&lt;</span>I<span class="op">&gt;</span> I2<span class="op">&gt;</span></span>
<span id="cb9-47"><a href="#cb9-47"></a>      <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">friend</span> <span class="kw">constexpr</span> strong_ordering <span class="kw">operator</span><span class="op">&lt;=&gt;(</span></span>
<span id="cb9-48"><a href="#cb9-48"></a>        <span class="kw">const</span> counted_iterator<span class="op">&amp;</span> x, <span class="kw">const</span> counted_iterator<span class="op">&lt;</span>I2<span class="op">&gt;&amp;</span> y<span class="op">)</span>;</span>
<span id="cb9-49"><a href="#cb9-49"></a></span>
<span id="cb9-50"><a href="#cb9-50"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">friend</span> <span class="kw">constexpr</span> iter_rvalue_reference_t<span class="op">&lt;</span>I<span class="op">&gt;</span> iter_move<span class="op">(</span><span class="kw">const</span> counted_iterator<span class="op">&amp;</span> i<span class="op">)</span></span>
<span id="cb9-51"><a href="#cb9-51"></a>      <span class="kw">noexcept</span><span class="op">(</span><span class="kw">noexcept</span><span class="op">(</span>ranges<span class="op">::</span>iter_move<span class="op">(</span>i<span class="op">.</span>current<span class="op">)))</span></span>
<span id="cb9-52"><a href="#cb9-52"></a>        <span class="kw">requires</span> input_iterator<span class="op">&lt;</span>I<span class="op">&gt;</span>;</span>
<span id="cb9-53"><a href="#cb9-53"></a>    <span class="op">...</span></span>
<span id="cb9-54"><a href="#cb9-54"></a>  <span class="op">}</span>;</span>
<span id="cb9-55"><a href="#cb9-55"></a><span class="op">}</span></span></code></pre></div>
<h2 data-number="7.4" id="class-template-istream_iterator-istream.iterator"><span class="header-section-number">7.4</span> Class template <code class="sourceCode default">istream_iterator</code> [istream.iterator]<a href="#class-template-istream_iterator-istream.iterator" class="self-link"></a></h2>
<div class="sourceCode" id="cb10"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb10-1"><a href="#cb10-1"></a><span class="kw">namespace</span> std <span class="op">{</span></span>
<span id="cb10-2"><a href="#cb10-2"></a>  <span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> T, <span class="kw">class</span> charT <span class="op">=</span> <span class="dt">char</span>, <span class="kw">class</span> traits <span class="op">=</span> char_traits<span class="op">&lt;</span>charT<span class="op">&gt;</span>,</span>
<span id="cb10-3"><a href="#cb10-3"></a>           <span class="kw">class</span> Distance <span class="op">=</span> <span class="dt">ptrdiff_t</span><span class="op">&gt;</span></span>
<span id="cb10-4"><a href="#cb10-4"></a>  <span class="kw">class</span> istream_iterator <span class="op">{</span></span>
<span id="cb10-5"><a href="#cb10-5"></a>  <span class="kw">public</span><span class="op">:</span></span>
<span id="cb10-6"><a href="#cb10-6"></a>    <span class="op">...</span></span>
<span id="cb10-7"><a href="#cb10-7"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">const</span> T<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">*()</span> <span class="kw">const</span>;</span>
<span id="cb10-8"><a href="#cb10-8"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">const</span> T<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">-&gt;()</span> <span class="kw">const</span>;</span>
<span id="cb10-9"><a href="#cb10-9"></a>    istream_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">++()</span>;</span>
<span id="cb10-10"><a href="#cb10-10"></a>    istream_iterator <span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span>;</span>
<span id="cb10-11"><a href="#cb10-11"></a></span>
<span id="cb10-12"><a href="#cb10-12"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">friend</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> istream_iterator<span class="op">&amp;</span> i, default_sentinel_t<span class="op">)</span>;</span>
<span id="cb10-13"><a href="#cb10-13"></a>    <span class="op">...</span></span>
<span id="cb10-14"><a href="#cb10-14"></a>  <span class="op">}</span>;</span>
<span id="cb10-15"><a href="#cb10-15"></a><span class="op">}</span></span></code></pre></div>
<h2 data-number="7.5" id="class-template-ostream_iterator-ostream.iterator"><span class="header-section-number">7.5</span> Class template <code class="sourceCode default">ostream_iterator</code> [ostream.iterator]<a href="#class-template-ostream_iterator-ostream.iterator" class="self-link"></a></h2>
<div class="sourceCode" id="cb11"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb11-1"><a href="#cb11-1"></a><span class="kw">namespace</span> std <span class="op">{</span></span>
<span id="cb11-2"><a href="#cb11-2"></a>  <span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> T, <span class="kw">class</span> charT <span class="op">=</span> <span class="dt">char</span>, <span class="kw">class</span> traits <span class="op">=</span> char_traits<span class="op">&lt;</span>charT<span class="op">&gt;&gt;</span></span>
<span id="cb11-3"><a href="#cb11-3"></a>  <span class="kw">class</span> ostream_iterator <span class="op">{</span></span>
<span id="cb11-4"><a href="#cb11-4"></a>  <span class="kw">public</span><span class="op">:</span></span>
<span id="cb11-5"><a href="#cb11-5"></a>    <span class="op">...</span></span>
<span id="cb11-6"><a href="#cb11-6"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">const</span> T<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">*()</span> <span class="kw">const</span>;</span>
<span id="cb11-7"><a href="#cb11-7"></a>    ostream_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">++()</span>;</span>
<span id="cb11-8"><a href="#cb11-8"></a>    ostream_iterator <span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span>;</span>
<span id="cb11-9"><a href="#cb11-9"></a>    <span class="op">...</span></span>
<span id="cb11-10"><a href="#cb11-10"></a>  <span class="op">}</span>;</span>
<span id="cb11-11"><a href="#cb11-11"></a><span class="op">}</span></span></code></pre></div>
<h2 data-number="7.6" id="class-template-istreambuf_iterator-istreambuf.iterator"><span class="header-section-number">7.6</span> Class template <code class="sourceCode default">istreambuf_iterator</code> [istreambuf.iterator]<a href="#class-template-istreambuf_iterator-istreambuf.iterator" class="self-link"></a></h2>
<div class="sourceCode" id="cb12"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb12-1"><a href="#cb12-1"></a><span class="kw">namespace</span> std <span class="op">{</span></span>
<span id="cb12-2"><a href="#cb12-2"></a>  <span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> charT, <span class="kw">class</span> traits <span class="op">=</span> char_traits<span class="op">&lt;</span>charT<span class="op">&gt;&gt;</span></span>
<span id="cb12-3"><a href="#cb12-3"></a>  <span class="kw">class</span> istreambuf_iterator <span class="op">{</span></span>
<span id="cb12-4"><a href="#cb12-4"></a>  <span class="kw">public</span><span class="op">:</span></span>
<span id="cb12-5"><a href="#cb12-5"></a>    <span class="op">...</span></span>
<span id="cb12-6"><a href="#cb12-6"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> charT <span class="kw">operator</span><span class="op">*()</span> <span class="kw">const</span>;</span>
<span id="cb12-7"><a href="#cb12-7"></a>    istreambuf_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">++()</span>;</span>
<span id="cb12-8"><a href="#cb12-8"></a>    <em>proxy</em> <span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span>;</span>
<span id="cb12-9"><a href="#cb12-9"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="dt">bool</span> equal<span class="op">(</span><span class="kw">const</span> istreambuf_iterator<span class="op">&amp;</span> b<span class="op">)</span> <span class="kw">const</span>;</span>
<span id="cb12-10"><a href="#cb12-10"></a></span>
<span id="cb12-11"><a href="#cb12-11"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="kw">friend</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> istreambuf_iterator<span class="op">&amp;</span> i, default_sentinel_t s<span class="op">)</span>;</span>
<span id="cb12-12"><a href="#cb12-12"></a>    <span class="op">...</span></span>
<span id="cb12-13"><a href="#cb12-13"></a>  <span class="op">}</span>;</span>
<span id="cb12-14"><a href="#cb12-14"></a><span class="op">}</span></span></code></pre></div>
<h2 data-number="7.7" id="class-template-ostreambuf_iterator-ostreambuf.iterator"><span class="header-section-number">7.7</span> Class template <code class="sourceCode default">ostreambuf_iterator</code> [ostreambuf.iterator]<a href="#class-template-ostreambuf_iterator-ostreambuf.iterator" class="self-link"></a></h2>
<div class="sourceCode" id="cb13"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb13-1"><a href="#cb13-1"></a><span class="kw">namespace</span> std <span class="op">{</span></span>
<span id="cb13-2"><a href="#cb13-2"></a>  <span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> charT, <span class="kw">class</span> traits <span class="op">=</span> char_traits<span class="op">&lt;</span>charT<span class="op">&gt;&gt;</span></span>
<span id="cb13-3"><a href="#cb13-3"></a>  <span class="kw">class</span> ostreambuf_iterator <span class="op">{</span></span>
<span id="cb13-4"><a href="#cb13-4"></a>  <span class="kw">public</span><span class="op">:</span></span>
<span id="cb13-5"><a href="#cb13-5"></a>    <span class="op">...</span></span>
<span id="cb13-6"><a href="#cb13-6"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> ostreambuf_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">*()</span> <span class="kw">const</span>;</span>
<span id="cb13-7"><a href="#cb13-7"></a>    ostreambuf_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">++()</span>;</span>
<span id="cb13-8"><a href="#cb13-8"></a>    ostreambuf_iterator<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span>;</span>
<span id="cb13-9"><a href="#cb13-9"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">[[nodiscard]]</code></span></ins></span> <span class="dt">bool</span> failed<span class="op">()</span> <span class="kw">const</span>;</span>
<span id="cb13-10"><a href="#cb13-10"></a>    <span class="op">...</span></span>
<span id="cb13-11"><a href="#cb13-11"></a>  <span class="op">}</span>;</span>
<span id="cb13-12"><a href="#cb13-12"></a><span class="op">}</span></span></code></pre></div>
<h1 data-number="8" id="acknowledgements"><span class="header-section-number">8</span> Acknowledgements<a href="#acknowledgements" class="self-link"></a></h1>
<p>The author would like to thank Nicole Mazzuca and Ben Craig for reviewing this proposal.</p>
</div>
</div>
</body>
</html>
