<!DOCTYPE html>
<!-- saved from url=(0061)https://isocpp.org/files/papers/D2836R1.html#proposed-wording -->
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang=""><head><meta http-equiv="Content-Type" content="text/html; 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="2023-07-08">
  <title>`std::basic_const_iterator` should follow its underlying type's
convertibility</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.csl-block{margin-left: 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; }
      .sourceCode { overflow: visible; }
      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;
text-align: justify;
}
@media screen and (max-width: 30em) {
body {
margin: 1.5em;
}
}
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"><code class="sourceCode default">std::basic_const_iterator</code>
should follow its underlying type’s convertibility</h1>
<table style="border:none;float:right">
  <tbody><tr>
    <td>Document #:</td>
    <td>P2836R1</td>
  </tr>
  <tr>
    <td>Date:</td>
    <td>2023-07-08</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>
      Ranges Study Group (SG9)<br>
      Library Evolution Working Group (LEWG)<br>
      Library Working Group (LWG)<br>
    </td>
  </tr>
  <tr>
    <td style="vertical-align:top">Reply-to:</td>
    <td>
      Christopher Di Bella<br>&lt;<a href="mailto:cjdb@google.com" class="email">cjdb@google.com</a>&gt;<br>
    </td>
  </tr>
</tbody></table>
</header>
<div style="clear:both">
<div id="TOC" role="doc-toc">
<h1 id="toctitle">Contents</h1>
<ul>
<li><a href="https://isocpp.org/files/papers/D2836R1.html#introduction" id="toc-introduction"><span class="toc-section-number">1</span> Introduction<span></span></a></li>
<li><a href="https://isocpp.org/files/papers/D2836R1.html#acknowledgements" id="toc-acknowledgements"><span class="toc-section-number">2</span> Acknowledgements<span></span></a>
<ul>
<li><a href="https://isocpp.org/files/papers/D2836R1.html#r1" id="toc-r1"><span class="toc-section-number">2.1</span> R1<span></span></a></li>
<li><a href="https://isocpp.org/files/papers/D2836R1.html#r0" id="toc-r0"><span class="toc-section-number">2.2</span> R0<span></span></a></li>
</ul></li>
<li><a href="https://isocpp.org/files/papers/D2836R1.html#changes-between-r0-and-r1" id="toc-changes-between-r0-and-r1"><span class="toc-section-number">3</span> Changes between R0 and
R1<span></span></a>
<ul>
<li><a href="https://isocpp.org/files/papers/D2836R1.html#recap" id="toc-recap"><span class="toc-section-number">3.1</span> Recap<span></span></a></li>
<li><a href="https://isocpp.org/files/papers/D2836R1.html#change-in-design-and-title" id="toc-change-in-design-and-title"><span class="toc-section-number">3.2</span> Change in design (and
title)<span></span></a></li>
<li><a href="https://isocpp.org/files/papers/D2836R1.html#which-standard-is-this-targeting" id="toc-which-standard-is-this-targeting"><span class="toc-section-number">3.3</span> Which standard is this
targeting?<span></span></a></li>
</ul></li>
<li><a href="https://isocpp.org/files/papers/D2836R1.html#problem" id="toc-problem"><span class="toc-section-number">4</span> Problem<span></span></a></li>
<li><a href="https://isocpp.org/files/papers/D2836R1.html#proposed-resolution" id="toc-proposed-resolution"><span class="toc-section-number">5</span> Proposed
resolution<span></span></a></li>
<li><a href="https://isocpp.org/files/papers/D2836R1.html#proposed-wording" id="toc-proposed-wording"><span class="toc-section-number">6</span> Proposed wording<span></span></a>
<ul>
<li><a href="https://isocpp.org/files/papers/D2836R1.html#changes-to-version.syn" id="toc-changes-to-version.syn"><span class="toc-section-number">6.1</span> Changes to
[version.syn]<span></span></a></li>
<li><a href="https://isocpp.org/files/papers/D2836R1.html#changes-to-const.iterators.iterator" id="toc-changes-to-const.iterators.iterator"><span class="toc-section-number">6.2</span> Changes to
[const.iterators.iterator]<span></span></a></li>
<li><a href="https://isocpp.org/files/papers/D2836R1.html#changes-to-const.iterators.ops" id="toc-changes-to-const.iterators.ops"><span class="toc-section-number">6.3</span> Changes to
[const.iterators.ops]<span></span></a></li>
</ul></li>
<li><a href="https://isocpp.org/files/papers/D2836R1.html#implementation-experience" id="toc-implementation-experience"><span class="toc-section-number">7</span> Implementation
experience<span></span></a></li>
<li><a href="https://isocpp.org/files/papers/D2836R1.html#bibliography" id="toc-bibliography"><span class="toc-section-number">8</span> References<span></span></a></li>
</ul>
</div>
<h1 data-number="1" id="introduction"><span class="header-section-number">1</span> Introduction<a href="https://isocpp.org/files/papers/D2836R1.html#introduction" class="self-link"></a></h1>
<p>Many <code class="sourceCode default">iterator</code>s can be
implicitly converted to their corresponding
<code class="sourceCode default">const_iterator</code>—such as the
standard containers’—but
<code class="sourceCode default">basic_const_iterator</code> doesn’t
permit that (yet).</p>
<h1 data-number="2" id="acknowledgements"><span class="header-section-number">2</span> Acknowledgements<a href="https://isocpp.org/files/papers/D2836R1.html#acknowledgements" class="self-link"></a></h1>
<h2 data-number="2.1" id="r1"><span class="header-section-number">2.1</span> R1<a href="https://isocpp.org/files/papers/D2836R1.html#r1" class="self-link"></a></h2>
<p>Thank you to Barry Revzin and Tomasz Kamiński for their patience in
explaining why the direction outlined in R0 wasn’t feasible. Also thanks
for helping to tease out the parts that could be fixed via a <a href="https://cplusplus.github.io/LWG/lwg-active.html#3946">defect
report</a>, rather than a full-on proposal.</p>
<p>Double thanks to Tomasz, who has agreed to represent this paper in my
absence.</p>
<h2 data-number="2.2" id="r0"><span class="header-section-number">2.2</span> R0<a href="https://isocpp.org/files/papers/D2836R1.html#r0" class="self-link"></a></h2>
<p>Thank you to Richard Smith, Janet Cobb, Nicole Mazzuca, and David
Blaikie for providing feedback on the text and design of the proposed
resolution.</p>
<p>Thank you to Nicole and Stephan T. Lavavej (STL) for reviewing the CL
that implements the proposed fix in my Microsoft/STL fork.</p>
<h1 data-number="3" id="changes-between-r0-and-r1"><span class="header-section-number">3</span> Changes between R0 and R1<a href="https://isocpp.org/files/papers/D2836R1.html#changes-between-r0-and-r1" class="self-link"></a></h1>
<h2 data-number="3.1" id="recap"><span class="header-section-number">3.1</span> Recap<a href="https://isocpp.org/files/papers/D2836R1.html#recap" class="self-link"></a></h2>
<p><span class="citation" data-cites="P2836R0">[<a href="https://isocpp.org/files/papers/D2836R1.html#ref-P2836R0" role="doc-biblioref">P2836R0</a>]</span> (previous revision) wanted to
introduce a trait-like type to identify an iterator’s corresponding
<code class="sourceCode default">const_iterator</code>, and use that to
limit the number of redundant function template instantiations and debug
info that a program would generate from using
<code class="sourceCode default">basic_const_iterator</code>.</p>
<h2 data-number="3.2" id="change-in-design-and-title"><span class="header-section-number">3.2</span> Change in design (and title)<a href="https://isocpp.org/files/papers/D2836R1.html#change-in-design-and-title" class="self-link"></a></h2>
<p>Barry and Tomasz both pointed out over emails (some of which are on
the reflector) that this trait wouldn’t address the following
situation:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb1-1"><a href="https://isocpp.org/files/papers/D2836R1.html#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">namespace</span> stdv <span class="op">=</span> std<span class="op">::</span>views;</span>
<span id="cb1-2"><a href="https://isocpp.org/files/papers/D2836R1.html#cb1-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-3"><a href="https://isocpp.org/files/papers/D2836R1.html#cb1-3" aria-hidden="true" tabindex="-1"></a><span class="kw">auto</span> v <span class="op">=</span> std<span class="op">::</span>vector<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;()</span>;</span>
<span id="cb1-4"><a href="https://isocpp.org/files/papers/D2836R1.html#cb1-4" aria-hidden="true" tabindex="-1"></a><span class="kw">auto</span> t <span class="op">=</span> v <span class="op">|</span> stdv<span class="op">::</span>take_while<span class="op">([](</span><span class="dt">int</span> <span class="kw">const</span> x<span class="op">)</span> <span class="op">{</span> <span class="cf">return</span> x <span class="op">&lt;</span> <span class="dv">100</span>; <span class="op">})</span>;</span>
<span id="cb1-5"><a href="https://isocpp.org/files/papers/D2836R1.html#cb1-5" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-6"><a href="https://isocpp.org/files/papers/D2836R1.html#cb1-6" aria-hidden="true" tabindex="-1"></a>v<span class="op">.</span>begin<span class="op">()</span> <span class="op">==</span> t<span class="op">.</span>end<span class="op">()</span>; <span class="co">// okay</span></span>
<span id="cb1-7"><a href="https://isocpp.org/files/papers/D2836R1.html#cb1-7" aria-hidden="true" tabindex="-1"></a>v<span class="op">.</span>cbegin<span class="op">()</span> <span class="op">==</span> t<span class="op">.</span>end<span class="op">()</span>; <span class="co">// error, see Tomasz's example from C++20: https://godbolt.org/z/Txa5cGYYY</span></span></code></pre></div>
<p>Tomasz explained that having <code class="sourceCode default">std::const_iterator&lt;std::vector&lt;int&gt;::iterator&gt;</code>
being <code class="sourceCode default">std::vector&lt;int&gt;::const_iterator</code>
would cause problems for
<code class="sourceCode default">t | stdv::as_const</code> in a similar
way.</p>
<p>This would be a crippling blow to the utility of ranges, and I’ve
received input from someone more experienced than myself in the area of
optimising debug info and program sizes, that while the added redundant
function template instantiations and extra debug info aren’t great,
they’re not likely to be antagonistic here.</p>
<p>With this in mind, R1 (this revision) proposes the alternative design
considered.</p>
<h2 data-number="3.3" id="which-standard-is-this-targeting"><span class="header-section-number">3.3</span> Which standard is this
targeting?<a href="https://isocpp.org/files/papers/D2836R1.html#which-standard-is-this-targeting" class="self-link"></a></h2>
<p>P2836R0 required a retroactive fix to C++23. This iteration has no
such requirement, so we’re now aiming for C++26, with encouragement to
implementers to backport this to C++23.</p>
<h1 data-number="4" id="problem"><span class="header-section-number">4</span> Problem<a href="https://isocpp.org/files/papers/D2836R1.html#problem" class="self-link"></a></h1>
<p>Consider</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb2-1"><a href="https://isocpp.org/files/papers/D2836R1.html#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="kw">auto</span> f <span class="op">=</span> <span class="op">[](</span>std<span class="op">::</span>vector<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;::</span>const_iterator i<span class="op">)</span> <span class="op">{}</span>;</span>
<span id="cb2-2"><a href="https://isocpp.org/files/papers/D2836R1.html#cb2-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-3"><a href="https://isocpp.org/files/papers/D2836R1.html#cb2-3" aria-hidden="true" tabindex="-1"></a><span class="kw">auto</span> v <span class="op">=</span> std<span class="op">::</span>vector<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;()</span>;</span>
<span id="cb2-4"><a href="https://isocpp.org/files/papers/D2836R1.html#cb2-4" aria-hidden="true" tabindex="-1"></a><span class="op">{</span></span>
<span id="cb2-5"><a href="https://isocpp.org/files/papers/D2836R1.html#cb2-5" aria-hidden="true" tabindex="-1"></a>  <span class="kw">auto</span> i1 <span class="op">=</span> std<span class="op">::</span>ranges<span class="op">::</span>cbegin<span class="op">(</span>v<span class="op">)</span>; <span class="co">// returns vector&lt;T&gt;::const_iterator</span></span>
<span id="cb2-6"><a href="https://isocpp.org/files/papers/D2836R1.html#cb2-6" aria-hidden="true" tabindex="-1"></a>  f<span class="op">(</span>i1<span class="op">)</span>; <span class="co">// okay</span></span>
<span id="cb2-7"><a href="https://isocpp.org/files/papers/D2836R1.html#cb2-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb2-8"><a href="https://isocpp.org/files/papers/D2836R1.html#cb2-8" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-9"><a href="https://isocpp.org/files/papers/D2836R1.html#cb2-9" aria-hidden="true" tabindex="-1"></a><span class="kw">auto</span> t <span class="op">=</span> v <span class="op">|</span> stdv<span class="op">::</span>take_while<span class="op">([](</span><span class="dt">int</span> <span class="kw">const</span> x<span class="op">)</span> <span class="op">{</span> <span class="cf">return</span> x <span class="op">&lt;</span> <span class="dv">100</span>; <span class="op">})</span>;</span>
<span id="cb2-10"><a href="https://isocpp.org/files/papers/D2836R1.html#cb2-10" aria-hidden="true" tabindex="-1"></a><span class="op">{</span></span>
<span id="cb2-11"><a href="https://isocpp.org/files/papers/D2836R1.html#cb2-11" aria-hidden="true" tabindex="-1"></a>  <span class="kw">auto</span> i2 <span class="op">=</span> std<span class="op">::</span>ranges<span class="op">::</span>cbegin<span class="op">(</span>t<span class="op">)</span>; <span class="co">// returns basic_const_iterator&lt;vector&lt;T&gt;::iterator&gt;</span></span>
<span id="cb2-12"><a href="https://isocpp.org/files/papers/D2836R1.html#cb2-12" aria-hidden="true" tabindex="-1"></a>  f<span class="op">(</span>i2<span class="op">)</span>; <span class="co">// error in C++23</span></span>
<span id="cb2-13"><a href="https://isocpp.org/files/papers/D2836R1.html#cb2-13" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p>The first call to <code class="sourceCode default">f</code> is
allowed because
<code class="sourceCode default">vector&lt;int&gt;::iterator</code> is
implicitly convertible to <code class="sourceCode default">vector&lt;int&gt;::const_iterator</code>.
<code class="sourceCode default">basic_const_iterator</code> doesn’t
have any conversion operators, and so we can’t convert <code class="sourceCode default">basic_const_iterator&lt;vector&lt;int&gt;::iterator&gt;</code>
to <code class="sourceCode default">vector&lt;int&gt;::const_iterator</code>,
despite them being the same logical type.</p>
<p>Note that this works in C++20, but that was because
<code class="sourceCode default">ranges::cbegin(t)</code> returned
<code class="sourceCode default">vector&lt;int&gt;::iterator</code>
instead (<span class="citation" data-cites="P2278R4">[<a href="https://isocpp.org/files/papers/D2836R1.html#ref-P2278R4" role="doc-biblioref">P2278R4</a>]</span> was a C++23
addition).</p>
<h1 data-number="5" id="proposed-resolution"><span class="header-section-number">5</span> Proposed resolution<a href="https://isocpp.org/files/papers/D2836R1.html#proposed-resolution" class="self-link"></a></h1>
<p>This paper proposes to make it possible for
<code class="sourceCode default">basic_const_iterator&lt;I&gt;</code> to
be implicitly convertible to any constant iterator that
<code class="sourceCode default">I</code> can be implicitly and
explicitly convertible to. This solves the above problem in a
non-intrusive manner to users, while also keeping the const model.</p>
<p>The paper also proposes that this be considered library DR, so that
C++20 code won’t be broken during migration to C++23.</p>
<h1 data-number="6" id="proposed-wording"><span class="header-section-number">6</span> Proposed wording<a href="https://isocpp.org/files/papers/D2836R1.html#proposed-wording" class="self-link"></a></h1>
<h2 data-number="6.1" id="changes-to-version.syn"><span class="header-section-number">6.1</span> Changes to [version.syn]<a href="https://isocpp.org/files/papers/D2836R1.html#changes-to-version.syn" class="self-link"></a></h2>
<div>
<div class="sourceCode" id="cb3"><pre class="sourceCode diff"><code class="sourceCode diff"><span id="cb3-1"><a href="https://isocpp.org/files/papers/D2836R1.html#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="st">- #define __cpp_lib_ranges_as_const                   202207L // also in &lt;ranges&gt;</span></span>
<span id="cb3-2"><a href="https://isocpp.org/files/papers/D2836R1.html#cb3-2" aria-hidden="true" tabindex="-1"></a><span class="va">+ #define __cpp_lib_ranges_as_const                   ??????L // also in &lt;ranges&gt;</span></span></code></pre></div>
</div>
<h2 data-number="6.2" id="changes-to-const.iterators.iterator"><span class="header-section-number">6.2</span> Changes to
[const.iterators.iterator]<a href="https://isocpp.org/files/papers/D2836R1.html#changes-to-const.iterators.iterator" class="self-link"></a></h2>
<div>
<div class="sourceCode" id="cb4"><pre class="sourceCode diff"><code class="sourceCode diff"><span id="cb4-1"><a href="https://isocpp.org/files/papers/D2836R1.html#cb4-1" aria-hidden="true" tabindex="-1"></a>  // ...</span>
<span id="cb4-2"><a href="https://isocpp.org/files/papers/D2836R1.html#cb4-2" aria-hidden="true" tabindex="-1"></a>     template&lt;sentinel_for&lt;Iterator&gt; S&gt;</span>
<span id="cb4-3"><a href="https://isocpp.org/files/papers/D2836R1.html#cb4-3" aria-hidden="true" tabindex="-1"></a>       constexpr bool operator==(const S&amp; s) const;</span>
<span id="cb4-4"><a href="https://isocpp.org/files/papers/D2836R1.html#cb4-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-5"><a href="https://isocpp.org/files/papers/D2836R1.html#cb4-5" aria-hidden="true" tabindex="-1"></a><span class="va">+    template&lt;<em>not-a-const-iterator</em> CI&gt;</span></span>
<span id="cb4-6"><a href="https://isocpp.org/files/papers/D2836R1.html#cb4-6" aria-hidden="true" tabindex="-1"></a><span class="va">+      requires <em>constant-iterator</em>&lt;CI&gt; &amp;&amp; convertible_to&lt;Iterator const&amp;, CI&gt;</span></span>
<span id="cb4-7"><a href="https://isocpp.org/files/papers/D2836R1.html#cb4-7" aria-hidden="true" tabindex="-1"></a><span class="va">+    constexpr operator CI() const&amp;;</span></span>
<span id="cb4-8"><a href="https://isocpp.org/files/papers/D2836R1.html#cb4-8" aria-hidden="true" tabindex="-1"></a><span class="va">+    template&lt;<em>not-a-const-iterator</em> CI&gt;</span></span>
<span id="cb4-9"><a href="https://isocpp.org/files/papers/D2836R1.html#cb4-9" aria-hidden="true" tabindex="-1"></a><span class="va">+      requires <em>constant-iterator</em>&lt;CI&gt; &amp;&amp; convertible_to&lt;Iterator, CI&gt;</span></span>
<span id="cb4-10"><a href="https://isocpp.org/files/papers/D2836R1.html#cb4-10" aria-hidden="true" tabindex="-1"></a><span class="va">+    constexpr operator CI() &amp;&amp;;</span></span>
<span id="cb4-11"><a href="https://isocpp.org/files/papers/D2836R1.html#cb4-11" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-12"><a href="https://isocpp.org/files/papers/D2836R1.html#cb4-12" aria-hidden="true" tabindex="-1"></a>     constexpr bool operator&lt;(const basic_const_iterator&amp; y) const</span>
<span id="cb4-13"><a href="https://isocpp.org/files/papers/D2836R1.html#cb4-13" aria-hidden="true" tabindex="-1"></a>       requires random_access_iterator&lt;Iterator&gt;;</span>
<span id="cb4-14"><a href="https://isocpp.org/files/papers/D2836R1.html#cb4-14" aria-hidden="true" tabindex="-1"></a>  // ...</span></code></pre></div>
</div>
<h2 data-number="6.3" id="changes-to-const.iterators.ops"><span class="header-section-number">6.3</span> Changes to
[const.iterators.ops]<a href="https://isocpp.org/files/papers/D2836R1.html#changes-to-const.iterators.ops" class="self-link"></a></h2>
<div class="sourceCode" id="cb5"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb5-1"><a href="https://isocpp.org/files/papers/D2836R1.html#cb5-1" aria-hidden="true" tabindex="-1"></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="cb5-2"><a href="https://isocpp.org/files/papers/D2836R1.html#cb5-2" aria-hidden="true" tabindex="-1"></a>  <span class="kw">constexpr</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> S<span class="op">&amp;</span> s<span class="op">)</span> <span class="kw">const</span>;</span></code></pre></div>
<p><em>Effects</em>: Equivalent to:
<code class="sourceCode default">return current_ == s;</code></p>
<div class="add" style="color: #006e28">

<div class="sourceCode" id="cb6"><pre class="sourceCode default cpp"><code class="sourceCode default"><span id="cb6-1"><a href="https://isocpp.org/files/papers/D2836R1.html#cb6-1" aria-hidden="true" tabindex="-1"></a>template&lt;<em>not-a-const-iterator</em> CI&gt;</span>
<span id="cb6-2"><a href="https://isocpp.org/files/papers/D2836R1.html#cb6-2" aria-hidden="true" tabindex="-1"></a>  requires <em>constant-iterator</em>&lt;CI&gt; &amp;&amp; convertible_to&lt;Iterator const&amp;, CI&gt;</span>
<span id="cb6-3"><a href="https://isocpp.org/files/papers/D2836R1.html#cb6-3" aria-hidden="true" tabindex="-1"></a>constexpr operator CI() const&amp;;</span></code></pre></div>
<p><em>Returns</em>:
<code class="sourceCode default">current_</code>.</p>
<div class="sourceCode" id="cb7"><pre class="sourceCode default cpp"><code class="sourceCode default"><span id="cb7-1"><a href="https://isocpp.org/files/papers/D2836R1.html#cb7-1" aria-hidden="true" tabindex="-1"></a>template&lt;<em>not-a-const-iterator</em> CI&gt;</span>
<span id="cb7-2"><a href="https://isocpp.org/files/papers/D2836R1.html#cb7-2" aria-hidden="true" tabindex="-1"></a>  requires <em>constant-iterator</em>&lt;CI&gt; &amp;&amp; convertible_to&lt;Iterator, CI&gt;</span>
<span id="cb7-3"><a href="https://isocpp.org/files/papers/D2836R1.html#cb7-3" aria-hidden="true" tabindex="-1"></a>constexpr operator CI() &amp;&amp;;</span></code></pre></div>
<p><em>Returns</em>:
<code class="sourceCode default">std::move(current_)</code>.</p>
</div>
<h1 data-number="7" id="implementation-experience"><span class="header-section-number">7</span> Implementation experience<a href="https://isocpp.org/files/papers/D2836R1.html#implementation-experience" class="self-link"></a></h1>
<p>The above wording has been implemented and tested using <a href="https://github.com/cjdb/Microsoft-STL/pull/2/files">a
Microsoft/STL fork</a>.</p>
<h1 data-number="8" id="bibliography"><span class="header-section-number">8</span> References<a href="https://isocpp.org/files/papers/D2836R1.html#bibliography" class="self-link"></a></h1>
<div id="refs" class="references csl-bib-body hanging-indent" role="doc-bibliography">
<div id="ref-P2278R4" class="csl-entry" role="doc-biblioentry">
[P2278R4] Barry Revzin. 2022-06-17. cbegin should always return a
constant iterator. <a href="https://wg21.link/p2278r4"><div class="csl-block">https://wg21.link/p2278r4</div></a>
</div>
<div id="ref-P2836R0" class="csl-entry" role="doc-biblioentry">
[P2836R0] Christopher Di Bella. 2023-03-21. std::const_iterator often
produces an unexpected type. <a href="https://wg21.link/p2836r0"><div class="csl-block">https://wg21.link/p2836r0</div></a>
</div>
</div>
</div>
</div>


</body></html>
