<!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="2025-06-20" />
  <title>Minor additions to C++26 standard library hardening</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">Minor additions to C++26
standard library hardening</h1>
<table style="border:none;float:right">
  <tr>
    <td>Document #:</td>
    <td>P3697R1</td>
  </tr>
  <tr>
    <td>Date:</td>
    <td>2025-06-20</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, Library<br>
    </td>
  </tr>
  <tr>
    <td style="vertical-align:top">Reply-to:</td>
    <td>
      Konstantin Varlamov<br>&lt;<a href="mailto:varconst@apple.com" class="email">varconst@apple.com</a>&gt;<br>
      Louis Dionne<br>&lt;<a href="mailto:ldionne@apple.com" class="email">ldionne@apple.com</a>&gt;<br>
      Alisdair Meredith<br>&lt;<a href="mailto:ameredith1@bloomberg.net" class="email">ameredith1@bloomberg.net</a>&gt;<br>
    </td>
  </tr>
</table>
</header>
<div style="clear:both">
<h1 data-number="1" id="introduction"><span class="header-section-number">1</span> Introduction<a href="#introduction" class="self-link"></a></h1>
<p>This paper is a small follow-up to <a href="wg21.link/P3471R4">P3471R4 “Standard Library Hardening”</a> that
hardens the preconditions of a few more library functions. All these
functions satisfy the same criteria as the ones in the original
paper:</p>
<ul>
<li>Violating the precondition results in a memory safety issue (an
out-of-bounds access or an access to uninitialized memory);</li>
<li>The call site has all the necessary data to perform the check;</li>
<li>The check can be done in constant time and imposes relatively little
overhead.</li>
</ul>
<p>In addition (unlike the “Notable omissions” section in the original
paper), these functions are comparatively standalone and don’t involve
complex interactions with other members of their respective classes. The
additions here are essentially oversights in the original paper that
were noticed during offline discussions with various people.</p>
<h1 data-number="2" id="list-of-functions"><span class="header-section-number">2</span> List of functions<a href="#list-of-functions" class="self-link"></a></h1>
<p>We propose to harden the relevant preconditions of the functions
listed below.</p>
<h2 data-number="2.1" id="basic_stacktrace"><span class="header-section-number">2.1</span>
<code class="sourceCode cpp">basic_stacktrace</code><a href="#basic_stacktrace" class="self-link"></a></h2>
<ul>
<li><code class="sourceCode cpp">current<span class="op">(</span>skip, max_depth<span class="op">)</span></code>.</li>
</ul>
<p>If <code class="sourceCode cpp">skip <span class="op">+</span> max_depth</code>
overflows, an implementation will attempt iterating over a range <code class="sourceCode cpp"><span class="op">[</span>i, j<span class="op">]</span></code>
where
<code class="sourceCode cpp">j <span class="op">&lt;</span> i</code>,
quickly going out of bounds;</p>
<ul>
<li><code class="sourceCode cpp"><span class="kw">operator</span><span class="op">[]</span></code>.</li>
</ul>
<p>This prevents a potential out-of-bounds access and brings the Library
closer to an ideal state where an <code class="sourceCode cpp"><span class="kw">operator</span><span class="op">[]</span></code>
can never cause a memory safety issue in a hardened implementation.</p>
<h2 data-number="2.2" id="shared_ptrtn"><span class="header-section-number">2.2</span> <code class="sourceCode cpp">shared_ptr<span class="op">&lt;</span>T<span class="op">[</span>N<span class="op">]&gt;</span></code><a href="#shared_ptrtn" class="self-link"></a></h2>
<ul>
<li><code class="sourceCode cpp"><span class="kw">operator</span><span class="op">[]</span></code>.</li>
</ul>
<p>In the case where the <code class="sourceCode cpp">shared_ptr</code>
points to an array with a statically known size, we are able to perform
bounds checking.</p>
<h2 data-number="2.3" id="view_interface"><span class="header-section-number">2.3</span>
<code class="sourceCode cpp">view_interface</code><a href="#view_interface" class="self-link"></a></h2>
<ul>
<li><code class="sourceCode cpp">front</code>;</li>
<li><code class="sourceCode cpp">back</code>.</li>
</ul>
<p>While we would like to explore hardening Ranges in a dedicated paper,
it has been observed that <code class="sourceCode cpp">view_interface<span class="op">::</span>front</code>
and <code class="sourceCode cpp">view_interface<span class="op">::</span>back</code>
are the only <code class="sourceCode cpp">front</code> and
<code class="sourceCode cpp">back</code> functions in the Library that
aren’t hardened, which might come as an unpleasant surprise to
users.</p>
<h2 data-number="2.4" id="counted_iterator"><span class="header-section-number">2.4</span>
<code class="sourceCode cpp">counted_iterator</code><a href="#counted_iterator" class="self-link"></a></h2>
<ul>
<li><code class="sourceCode cpp"><span class="kw">operator</span><span class="op">*</span></code>;</li>
<li><code class="sourceCode cpp"><span class="kw">operator</span><span class="op">[]</span></code>.</li>
</ul>
<p>Unlike most iterator types,
<code class="sourceCode cpp">counted_iterator</code> contains
<em>some</em> of the data necessary to check whether it is valid upon
dereference. Specifically, it can check for going out of bounds <em>past
the end</em> (since it needs to store the remaining
<code class="sourceCode cpp">length</code> of the sequence and can use
<code class="sourceCode cpp"><span class="dv">0</span></code> as an
indicator of reaching the end), but not <em>before the beginning</em>
(the iterator can be rewound but it does not store the original
<code class="sourceCode cpp">length</code> and thus cannot check whether
it’s being rewound past the original beginning). To visualize this,
<code class="sourceCode cpp">counted_iterator</code> can check the right
bound but not the left bound. We believe that hardening the
preconditions that already exist and can be easily checked is valuable
from a pragmative perspective and preferable to not hardening the class
at all.</p>
<p>Note that we are not hardening <code class="sourceCode cpp"><span class="kw">operator</span><span class="op">-&gt;</span></code>.
Unlike with other dereference operators, no immediate access happens
within the Library. In the current specification, it is not possible to
create an invalid (past the bounds, other than the special
“one-past-end”) <code class="sourceCode cpp">counted_iterator</code>
without invoking undefined behavior. Existing preconditions check
against the iterator being <em>incremented</em> beyond the end; there
are no explicit preconditions for <em>decrementing</em> the iterator,
but an implicit precondition follows from the fact that decrementing the
iterator to point before the beginning would result in forming an
invalid pointer, which is UB in itself. As mentioned above, for
hardening purposes we can only easily check against going past the end
(only half of the invariant).</p>
<ul>
<li><code class="sourceCode cpp">counted_iterator<span class="op">(</span>i, n<span class="op">)</span></code>;</li>
<li><code class="sourceCode cpp"><span class="kw">operator</span><span class="op">++</span></code>;</li>
<li><code class="sourceCode cpp"><span class="kw">operator</span><span class="op">+=</span></code>;</li>
<li><code class="sourceCode cpp"><span class="kw">operator</span><span class="op">-=</span></code>.</li>
</ul>
<p>These functions don’t access the underlying iterator but might end up
making <code class="sourceCode cpp">length</code> negative, going past
the end of the sequence. Do they need to be hardened, given that we also
harden the dereference operators? Hardening seems preferable; first,
from a more theoretical perspective, maintaining (to the extent
possible) the invariant that the iterator is always valid makes it
easier to reason about the class; also, setting
<code class="sourceCode cpp">current</code> to an invalid pointer is
undefined behavior in itself. Second, ensuring the iterator is always
valid (or one-past-end) also protects the <code class="sourceCode cpp"><span class="kw">operator</span><span class="op">-&gt;</span></code>
for which no explicit precondition currently exists. As stated above,
<code class="sourceCode cpp">counted_iterator</code> only contains data
necessary for checking against going past the end but not before the
beginning (thus <code class="sourceCode cpp"><span class="kw">operator</span><span class="op">--</span></code>
is not being hardened).</p>
<ul>
<li><code class="sourceCode cpp">iter_move<span class="op">(</span>counted_iterator<span class="op">)</span></code>;</li>
<li><code class="sourceCode cpp">iter_swap<span class="op">(</span>counted_iterator, counted_iterator<span class="op">)</span></code>.</li>
</ul>
<p>While <code class="sourceCode cpp">iter_move</code> and
<code class="sourceCode cpp">iter_swap</code> don’t access memory
directly, if the iterator (or one of the iterators) is past the end, it
creates a situation where an out-of-bounds access is almost guaranteed
and can no longer be easily checked.</p>
<h2 data-number="2.5" id="common_iterator"><span class="header-section-number">2.5</span>
<code class="sourceCode cpp">common_iterator</code><a href="#common_iterator" class="self-link"></a></h2>
<ul>
<li><code class="sourceCode cpp">common_iterator<span class="op">(</span><span class="kw">const</span> common_iterator<span class="op">&lt;</span>I2, S2<span class="op">&gt;&amp;)</span></code>;</li>
<li><code class="sourceCode cpp"><span class="kw">operator</span><span class="op">=</span></code>;</li>
<li><code class="sourceCode cpp"><span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> common_iterator<span class="op">&amp;</span>, <span class="kw">const</span> common_iterator<span class="op">&lt;</span>I2, S2<span class="op">&gt;&amp;)</span></code>;</li>
<li><code class="sourceCode cpp"><span class="kw">operator</span><span class="op">-(</span><span class="kw">const</span> common_iterator<span class="op">&amp;</span>, <span class="kw">const</span> common_iterator<span class="op">&lt;</span>I2, S2<span class="op">&gt;&amp;)</span></code>.</li>
</ul>
<p><code class="sourceCode cpp">common_iterator</code> is specified in
terms of a <code class="sourceCode cpp">variant</code>, and some of its
functions have a precondition that the
<code class="sourceCode cpp">variant</code> is not in the invalid state
(not <code class="sourceCode cpp">valueless_by_exception</code>). Thus,
unlike <code class="sourceCode cpp">variant</code> member functions that
are required to handle the case of
<code class="sourceCode cpp">valueless_by_exception</code> gracefully
(by throwing or returning a sentinel value), it is undefined behavior to
access a valueless <code class="sourceCode cpp">common_iterator</code> –
in practice, an implementation will likely access uninitialized memory.
This applies to any modifications to the underlying iterator object, not
only dereferences.</p>
<ul>
<li><code class="sourceCode cpp"><span class="kw">operator</span><span class="op">*</span></code>;</li>
<li><code class="sourceCode cpp"><span class="kw">operator</span><span class="op">-&gt;</span></code>;</li>
<li><code class="sourceCode cpp"><span class="kw">operator</span><span class="op">++</span></code>;</li>
<li><code class="sourceCode cpp"><span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span></code>;</li>
<li><code class="sourceCode cpp">iter_move<span class="op">(</span><span class="kw">const</span> common_iterator<span class="op">&amp;)</span></code>;</li>
<li><code class="sourceCode cpp">iter_swap<span class="op">(</span><span class="kw">const</span> common_iterator<span class="op">&amp;</span>, <span class="kw">const</span> common_iterator<span class="op">&lt;</span>I2, S2<span class="op">&gt;&amp;)</span></code>.</li>
</ul>
<p>Similarly, a few <code class="sourceCode cpp">common_iterator</code>
functions have a precondition that the
<code class="sourceCode cpp">common_iterator</code> holds an iterator
and not a sentinel, violating which might also result in a memory safety
issue.</p>
<h1 data-number="3" id="proposed-wording"><span class="header-section-number">3</span> Proposed wording<a href="#proposed-wording" class="self-link"></a></h1>
<h2 data-number="3.1" id="shared_ptr"><span class="header-section-number">3.1</span>
<code class="sourceCode cpp">shared_ptr</code><a href="#shared_ptr" class="self-link"></a></h2>
<h3 data-number="3.1.1" id="shared_ptrtnoperator"><span class="header-section-number">3.1.1</span> <code class="sourceCode cpp">shared_ptr<span class="op">&lt;</span>T<span class="op">[</span>N<span class="op">]&gt;::</span><span class="kw">operator</span><span class="op">[]</span></code><a href="#shared_ptrtnoperator" class="self-link"></a></h3>
<p>Modify <span>20.3.2.2.6
<a href="https://wg21.link/util.smartptr.shared.obs">[util.smartptr.shared.obs]</a></span>
around paragraph 8 as indicated:</p>
<blockquote>
<p><code class="sourceCode cpp">element_type<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">[](</span><span class="dt">ptrdiff_t</span> i<span class="op">)</span> <span class="kw">const</span>;</code></p>
<p><span class="marginalizedparent"><a class="marginalized">8</a></span>
<em>Preconditions</em>: <code class="sourceCode cpp">get<span class="op">()</span> <span class="op">!=</span> <span class="kw">nullptr</span></code>
<span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">&amp;&amp; i &gt;= 0</code></span>.
If <span><code class="sourceCode default">T</code></span> is
<span><code class="sourceCode default">U[N]</code></span>,
<span><code class="sourceCode default">i &lt; N</code></span></del></span>.</p>
<div class="add" style="color: #006e28">
<p><span class="marginalizedparent"><a class="marginalized">9</a></span>
<em>Hardened preconditions</em>:
<code class="sourceCode default">i &gt;= 0</code>. If
<code class="sourceCode default">T</code> is
<code class="sourceCode default">U[N]</code>,
<code class="sourceCode default">i &lt; N</code>.</p>
</div>
<p><span class="marginalizedparent"><a class="marginalized">10</a></span>
<em>Returns</em>: <code class="sourceCode cpp">get<span class="op">()[</span>i<span class="op">]</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">11</a></span>
<em>Throws</em>: Nothing.</p>
</blockquote>
<h2 data-number="3.2" id="view_interface-1"><span class="header-section-number">3.2</span>
<code class="sourceCode cpp">view_interface</code><a href="#view_interface-1" class="self-link"></a></h2>
<h3 data-number="3.2.1" id="view_interfacefront"><span class="header-section-number">3.2.1</span> <code class="sourceCode cpp">view_interface<span class="op">::</span>front</code><a href="#view_interfacefront" class="self-link"></a></h3>
<p>Modify <span>25.5.3.2
<a href="https://wg21.link/view.interface.members">[view.interface.members]</a></span>
paragraph 1 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb1"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a>constexpr decltype(auto) front() requires forward_range&lt;D&gt;;</span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a>constexpr decltype(auto) front() const requires forward_range&lt;const D&gt;;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp"><span class="op">!</span>empty<span class="op">()</span></code>
is <code class="sourceCode cpp"><span class="kw">true</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Effects</em>: Equivalent to: <code class="sourceCode cpp"><span class="cf">return</span> <span class="op">*</span>ranges<span class="op">::</span>begin<span class="op">(</span>derived<span class="op">())</span>;</code></p>
</blockquote>
<h3 data-number="3.2.2" id="view_interfaceback"><span class="header-section-number">3.2.2</span> <code class="sourceCode cpp">view_interface<span class="op">::</span>back</code><a href="#view_interfaceback" class="self-link"></a></h3>
<p>Modify <span>25.5.3.2
<a href="https://wg21.link/view.interface.members">[view.interface.members]</a></span>
paragraph 3 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb2"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a>constexpr decltype(auto) back() requires bidirectional_range&lt;D&gt; &amp;&amp; common_range&lt;D&gt;;</span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a>constexpr decltype(auto) back() const</span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a>  requires bidirectional_range&lt;const D&gt; &amp;&amp; common_range&lt;const D&gt;;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">3</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp"><span class="op">!</span>empty<span class="op">()</span></code>
is <code class="sourceCode cpp"><span class="kw">true</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">4</a></span>
<em>Effects</em>: Equivalent to: <code class="sourceCode cpp"><span class="cf">return</span> <span class="op">*</span>ranges<span class="op">::</span>prev<span class="op">(</span>ranges<span class="op">::</span>end<span class="op">(</span>derived<span class="op">()))</span>;</code></p>
</blockquote>
<h2 data-number="3.3" id="counted_iterator-1"><span class="header-section-number">3.3</span>
<code class="sourceCode cpp">counted_iterator</code><a href="#counted_iterator-1" class="self-link"></a></h2>
<h3 data-number="3.3.1" id="counted_iteratoroperator"><span class="header-section-number">3.3.1</span> <code class="sourceCode cpp">counted_iterator<span class="op">::</span><span class="kw">operator</span><span class="op">*</span></code><a href="#counted_iteratoroperator" class="self-link"></a></h3>
<p>Modify <span>24.5.7.4
<a href="https://wg21.link/counted.iter.elem">[counted.iter.elem]</a></span>
paragraph 1 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb3"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a>constexpr decltype(auto) operator*();</span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a>constexpr decltype(auto) operator*() const</span>
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a>  requires dereferenceable&lt;const I&gt;;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp">length <span class="op">&gt;</span> <span class="dv">0</span></code>
is <code class="sourceCode cpp"><span class="kw">true</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Effects</em>: Equivalent to: <code class="sourceCode cpp"><span class="cf">return</span> <span class="op">*</span>current;</code></p>
</blockquote>
<h3 data-number="3.3.2" id="counted_iteratoroperator-1"><span class="header-section-number">3.3.2</span> <code class="sourceCode cpp">counted_iterator<span class="op">::</span><span class="kw">operator</span><span class="op">[]</span></code><a href="#counted_iteratoroperator-1" class="self-link"></a></h3>
<p>Modify <span>24.5.7.4
<a href="https://wg21.link/counted.iter.elem">[counted.iter.elem]</a></span>
paragraph 4 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb4"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a>constexpr decltype(auto) operator[](iter_difference_t&lt;I&gt; n) const</span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a>  requires random_access_iterator&lt;I&gt;;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">4</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp">n <span class="op">&lt;</span> length</code>
<span class="add" style="color: #006e28"><ins>is
<span><code class="sourceCode default">true</code></span></ins></span>.</p>
<p><span class="marginalizedparent"><a class="marginalized">5</a></span>
<em>Effects</em>: Equivalent to: <code class="sourceCode cpp"><span class="cf">return</span> current<span class="op">[</span>n<span class="op">]</span>;</code></p>
</blockquote>
<h3 data-number="3.3.3" id="iter_moveconst-counted_iterator"><span class="header-section-number">3.3.3</span> <code class="sourceCode cpp">iter_move<span class="op">(</span><span class="kw">const</span> counted_iterator<span class="op">&amp;)</span></code><a href="#iter_moveconst-counted_iterator" class="self-link"></a></h3>
<p>Modify <span>24.5.7.7
<a href="https://wg21.link/counted.iter.cust">[counted.iter.cust]</a></span>
paragraph 1 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb5"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a>friend constexpr decltype(auto)</span>
<span id="cb5-2"><a href="#cb5-2" aria-hidden="true" tabindex="-1"></a>  iter_move(const counted_iterator&amp; i)</span>
<span id="cb5-3"><a href="#cb5-3" aria-hidden="true" tabindex="-1"></a>    noexcept(noexcept(ranges::iter_move(i.current)))</span>
<span id="cb5-4"><a href="#cb5-4" aria-hidden="true" tabindex="-1"></a>    requires input_iterator&lt;I&gt;;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp">i<span class="op">.</span>length <span class="op">&gt;</span> <span class="dv">0</span></code>
is <code class="sourceCode cpp"><span class="kw">true</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Effects</em>: Equivalent to: <code class="sourceCode cpp"><span class="cf">return</span> ranges<span class="op">::</span>iter_move<span class="op">(</span>i<span class="op">.</span>current<span class="op">)</span>;</code></p>
</blockquote>
<h3 data-number="3.3.4" id="iter_swapconst-counted_iterator-const-counted_iteratori2"><span class="header-section-number">3.3.4</span> <code class="sourceCode cpp">iter_swap<span class="op">(</span><span class="kw">const</span> counted_iterator<span class="op">&amp;</span>, <span class="kw">const</span> counted_iterator<span class="op">&lt;</span>I2<span class="op">&gt;&amp;)</span></code><a href="#iter_swapconst-counted_iterator-const-counted_iteratori2" class="self-link"></a></h3>
<p>Modify <span>24.5.7.7
<a href="https://wg21.link/counted.iter.cust">[counted.iter.cust]</a></span>
paragraph 3 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb6"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a>template&lt;indirectly_swappable&lt;I&gt; I2&gt;</span>
<span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a>  friend constexpr void</span>
<span id="cb6-3"><a href="#cb6-3" aria-hidden="true" tabindex="-1"></a>    iter_swap(const counted_iterator&amp; x, const counted_iterator&lt;I2&gt;&amp; y)</span>
<span id="cb6-4"><a href="#cb6-4" aria-hidden="true" tabindex="-1"></a>      noexcept(noexcept(ranges::iter_swap(x.current, y.current)));</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">3</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
Both <code class="sourceCode cpp">x<span class="op">.</span>length <span class="op">&gt;</span> <span class="dv">0</span></code>
and <code class="sourceCode cpp">y<span class="op">.</span>length <span class="op">&gt;</span> <span class="dv">0</span></code>
are
<code class="sourceCode cpp"><span class="kw">true</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">4</a></span>
<em>Effects</em>: Equivalent to <code class="sourceCode cpp">ranges<span class="op">::</span>iter_swap<span class="op">(</span>x<span class="op">.</span>current, y<span class="op">.</span>current<span class="op">)</span></code>.</p>
</blockquote>
<h3 data-number="3.3.5" id="counted_iteratorcounted_iteratori-iter_difference_tt"><span class="header-section-number">3.3.5</span> <code class="sourceCode cpp">counted_iterator<span class="op">::</span>counted_iterator<span class="op">(</span>I, iter_difference_t<span class="op">&lt;</span>T<span class="op">&gt;)</span></code><a href="#counted_iteratorcounted_iteratori-iter_difference_tt" class="self-link"></a></h3>
<p>Modify <span>24.5.7.2
<a href="https://wg21.link/counted.iter.const">[counted.iter.const]</a></span>
paragraph 1 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb7"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a>constexpr counted_iterator(I i, iter_difference_t&lt;I&gt; n);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp">n <span class="op">&gt;=</span> <span class="dv">0</span></code>
<span class="add" style="color: #006e28"><ins>is
<span><code class="sourceCode default">true</code></span></ins></span>.</p>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Effects</em>: Initializes
<code class="sourceCode cpp">current</code> with <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>i<span class="op">)</span></code>
and <code class="sourceCode cpp">length</code> with
<code class="sourceCode cpp">n</code>.</p>
</blockquote>
<h3 data-number="3.3.6" id="counted_iteratoroperator-2"><span class="header-section-number">3.3.6</span> <code class="sourceCode cpp">counted_iterator<span class="op">::</span><span class="kw">operator</span><span class="op">++</span></code><a href="#counted_iteratoroperator-2" class="self-link"></a></h3>
<p>Modify <span>24.5.7.5
<a href="https://wg21.link/counted.iter.nav">[counted.iter.nav]</a></span>
paragraph 1 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb8"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a>constexpr counted_iterator&amp; operator++();</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp">length <span class="op">&gt;</span> <span class="dv">0</span></code>
<span class="add" style="color: #006e28"><ins>is
<span><code class="sourceCode default">true</code></span></ins></span>.</p>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Effects</em>: Equivalent to:</p>
<div class="sourceCode" id="cb9"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true" tabindex="-1"></a>++current;</span>
<span id="cb9-2"><a href="#cb9-2" aria-hidden="true" tabindex="-1"></a>--length;</span>
<span id="cb9-3"><a href="#cb9-3" aria-hidden="true" tabindex="-1"></a>return *this;</span></code></pre></div>
</blockquote>
<h3 data-number="3.3.7" id="counted_iteratoroperatorint"><span class="header-section-number">3.3.7</span> <code class="sourceCode cpp">counted_iterator<span class="op">::</span><span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span></code><a href="#counted_iteratoroperatorint" class="self-link"></a></h3>
<p>Modify <span>24.5.7.5
<a href="https://wg21.link/counted.iter.nav">[counted.iter.nav]</a></span>
paragraph 3 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb10"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true" tabindex="-1"></a>constexpr decltype(auto) operator++(int);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">3</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp">length <span class="op">&gt;</span> <span class="dv">0</span></code>
<span class="add" style="color: #006e28"><ins>is
<span><code class="sourceCode default">true</code></span></ins></span>.</p>
<p><span class="marginalizedparent"><a class="marginalized">4</a></span>
<em>Effects</em>: Equivalent to:</p>
<div class="sourceCode" id="cb11"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true" tabindex="-1"></a>--length;</span>
<span id="cb11-2"><a href="#cb11-2" aria-hidden="true" tabindex="-1"></a>try { return current++; }</span>
<span id="cb11-3"><a href="#cb11-3" aria-hidden="true" tabindex="-1"></a>catch(...) { ++length; throw; }</span></code></pre></div>
</blockquote>
<h3 data-number="3.3.8" id="counted_iteratoroperator-3"><span class="header-section-number">3.3.8</span> <code class="sourceCode cpp">counted_iterator<span class="op">::</span><span class="kw">operator</span><span class="op">+=</span></code><a href="#counted_iteratoroperator-3" class="self-link"></a></h3>
<p>Modify <span>24.5.7.5
<a href="https://wg21.link/counted.iter.nav">[counted.iter.nav]</a></span>
paragraph 10 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb12"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true" tabindex="-1"></a>constexpr counted_iterator&amp; operator+=(iter_difference_t&lt;I&gt; n)</span>
<span id="cb12-2"><a href="#cb12-2" aria-hidden="true" tabindex="-1"></a>  requires random_access_iterator&lt;I&gt;;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">10</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp">n <span class="op">&lt;=</span> length</code>
<span class="add" style="color: #006e28"><ins>is
<span><code class="sourceCode default">true</code></span></ins></span>.</p>
<p><span class="marginalizedparent"><a class="marginalized">11</a></span>
<em>Effects</em>: Equivalent to:</p>
<div class="sourceCode" id="cb13"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true" tabindex="-1"></a>current += n;</span>
<span id="cb13-2"><a href="#cb13-2" aria-hidden="true" tabindex="-1"></a>length -= n;</span>
<span id="cb13-3"><a href="#cb13-3" aria-hidden="true" tabindex="-1"></a>return *this;</span></code></pre></div>
</blockquote>
<h3 data-number="3.3.9" id="counted_iteratoroperator-"><span class="header-section-number">3.3.9</span> <code class="sourceCode cpp">counted_iterator<span class="op">::</span><span class="kw">operator</span><span class="op">-=</span></code><a href="#counted_iteratoroperator-" class="self-link"></a></h3>
<p>Modify <span>24.5.7.5
<a href="https://wg21.link/counted.iter.nav">[counted.iter.nav]</a></span>
paragraph 17 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb14"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb14-1"><a href="#cb14-1" aria-hidden="true" tabindex="-1"></a>constexpr counted_iterator&amp; operator-=(iter_difference_t&lt;I&gt; n)</span>
<span id="cb14-2"><a href="#cb14-2" aria-hidden="true" tabindex="-1"></a>  requires random_access_iterator&lt;I&gt;;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">17</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp"><span class="op">-</span>n <span class="op">&lt;=</span> length</code>
<span class="add" style="color: #006e28"><ins>is
<span><code class="sourceCode default">true</code></span></ins></span>.</p>
<p><span class="marginalizedparent"><a class="marginalized">18</a></span>
<em>Effects</em>: Equivalent to:</p>
<div class="sourceCode" id="cb15"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb15-1"><a href="#cb15-1" aria-hidden="true" tabindex="-1"></a>current -= n;</span>
<span id="cb15-2"><a href="#cb15-2" aria-hidden="true" tabindex="-1"></a>length += n;</span>
<span id="cb15-3"><a href="#cb15-3" aria-hidden="true" tabindex="-1"></a>return *this;</span></code></pre></div>
</blockquote>
<h2 data-number="3.4" id="common_iterator-1"><span class="header-section-number">3.4</span>
<code class="sourceCode cpp">common_iterator</code><a href="#common_iterator-1" class="self-link"></a></h2>
<h3 data-number="3.4.1" id="common_iteratorconst-common_iteratori2-s2"><span class="header-section-number">3.4.1</span> <code class="sourceCode cpp">common_iterator<span class="op">(</span><span class="kw">const</span> common_iterator<span class="op">&lt;</span>I2, S2<span class="op">&gt;&amp;)</span></code><a href="#common_iteratorconst-common_iteratori2-s2" class="self-link"></a></h3>
<p>Modify <span>24.5.5.3
<a href="https://wg21.link/common.iter.const">[common.iter.const]</a></span>
paragraph 3 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb16"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb16-1"><a href="#cb16-1" aria-hidden="true" tabindex="-1"></a>template&lt;class I2, class S2&gt;</span>
<span id="cb16-2"><a href="#cb16-2" aria-hidden="true" tabindex="-1"></a>  requires convertible_to&lt;const I2&amp;, I&gt; &amp;&amp; convertible_to&lt;const S2&amp;, S&gt;</span>
<span id="cb16-3"><a href="#cb16-3" aria-hidden="true" tabindex="-1"></a>    constexpr common_iterator(const common_iterator&lt;I2, S2&gt;&amp; x);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">3</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp">x<span class="op">.</span>v_<span class="op">.</span>valueless_by_exception<span class="op">()</span></code>
is
<code class="sourceCode cpp"><span class="kw">false</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">4</a></span>
<em>Effects</em>: Initializes <code class="sourceCode cpp">v_</code> as
if by <code class="sourceCode cpp">v_<span class="op">{</span>in_place_index<span class="op">&lt;</span>i<span class="op">&gt;</span>, get<span class="op">&lt;</span>i<span class="op">&gt;(</span>x<span class="op">.</span>v_<span class="op">)}</span></code>,
where <code class="sourceCode cpp">i</code> is <code class="sourceCode cpp">x<span class="op">.</span>v_<span class="op">.</span>index<span class="op">()</span></code>.</p>
</blockquote>
<h3 data-number="3.4.2" id="common_iteratoroperator"><span class="header-section-number">3.4.2</span> <code class="sourceCode cpp">common_iterator<span class="op">::</span><span class="kw">operator</span><span class="op">=</span></code><a href="#common_iteratoroperator" class="self-link"></a></h3>
<p>Modify <span>24.5.5.3
<a href="https://wg21.link/common.iter.const">[common.iter.const]</a></span>
paragraph 5 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb17"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb17-1"><a href="#cb17-1" aria-hidden="true" tabindex="-1"></a>template&lt;class I2, class S2&gt;</span>
<span id="cb17-2"><a href="#cb17-2" aria-hidden="true" tabindex="-1"></a>  requires convertible_to&lt;const I2&amp;, I&gt; &amp;&amp; convertible_to&lt;const S2&amp;, S&gt; &amp;&amp;</span>
<span id="cb17-3"><a href="#cb17-3" aria-hidden="true" tabindex="-1"></a>           assignable_from&lt;I&amp;, const I2&amp;&gt; &amp;&amp; assignable_from&lt;S&amp;, const S2&amp;&gt;</span>
<span id="cb17-4"><a href="#cb17-4" aria-hidden="true" tabindex="-1"></a>    constexpr common_iterator&amp; operator=(const common_iterator&lt;I2, S2&gt;&amp; x);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">5</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp">x<span class="op">.</span>v_<span class="op">.</span>valueless_by_exception<span class="op">()</span></code>
is
<code class="sourceCode cpp"><span class="kw">false</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">6</a></span>
<em>Effects</em>: Equivalent to:</p>
<p><span class="marginalizedparent"><a class="marginalized">(6.1)</a></span> If
<code class="sourceCode cpp">v_<span class="op">.</span>index<span class="op">()</span> <span class="op">==</span> x<span class="op">.</span>v_<span class="op">.</span>index<span class="op">()</span></code>,
then <code class="sourceCode cpp">get<span class="op">&lt;</span>i<span class="op">&gt;(</span>v_<span class="op">)</span> <span class="op">=</span> get<span class="op">&lt;</span>i<span class="op">&gt;(</span>x<span class="op">.</span>v_<span class="op">)</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">(6.2)</a></span>
Otherwise, <code class="sourceCode cpp">v_<span class="op">.</span>emplace<span class="op">&lt;</span>i<span class="op">&gt;(</span>get<span class="op">&lt;</span>i<span class="op">&gt;(</span>x<span class="op">.</span>v_<span class="op">))</span></code>.</p>
<p>where <code class="sourceCode cpp">i</code> is <code class="sourceCode cpp">x<span class="op">.</span>v_<span class="op">.</span>index<span class="op">()</span></code>.</p>
</blockquote>
<h3 data-number="3.4.3" id="common_iteratoroperator-1"><span class="header-section-number">3.4.3</span> <code class="sourceCode cpp">common_iterator<span class="op">::</span><span class="kw">operator</span><span class="op">*</span></code><a href="#common_iteratoroperator-1" class="self-link"></a></h3>
<p>Modify <span>24.5.5.4
<a href="https://wg21.link/common.iter.access">[common.iter.access]</a></span>
paragraph 1 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb18"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb18-1"><a href="#cb18-1" aria-hidden="true" tabindex="-1"></a>constexpr decltype(auto) operator*();</span>
<span id="cb18-2"><a href="#cb18-2" aria-hidden="true" tabindex="-1"></a>constexpr decltype(auto) operator*() const</span>
<span id="cb18-3"><a href="#cb18-3" aria-hidden="true" tabindex="-1"></a>  requires dereferenceable&lt;const I&gt;;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp">holds_alternative<span class="op">&lt;</span>I<span class="op">&gt;(</span>v_<span class="op">)</span></code>
is <code class="sourceCode cpp"><span class="kw">true</span></code>.</p>
</blockquote>
<h3 data-number="3.4.4" id="common_iteratoroperator-"><span class="header-section-number">3.4.4</span> <code class="sourceCode cpp">common_iterator<span class="op">::</span><span class="kw">operator</span><span class="op">-&gt;</span></code><a href="#common_iteratoroperator-" class="self-link"></a></h3>
<p>Modify <span>24.5.5.4
<a href="https://wg21.link/common.iter.access">[common.iter.access]</a></span>
paragraph 4 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb19"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb19-1"><a href="#cb19-1" aria-hidden="true" tabindex="-1"></a>constexpr auto operator-&gt;() const</span>
<span id="cb19-2"><a href="#cb19-2" aria-hidden="true" tabindex="-1"></a>  requires <em>see below</em>;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">3</a></span>
The expression in the <em>requires-clause</em> is equivalent to:</p>
<div class="sourceCode" id="cb20"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb20-1"><a href="#cb20-1" aria-hidden="true" tabindex="-1"></a>indirectly_readable&lt;const I&gt; &amp;&amp;</span>
<span id="cb20-2"><a href="#cb20-2" aria-hidden="true" tabindex="-1"></a>(requires(const I&amp; i) { i.operator-&gt;(); } ||</span>
<span id="cb20-3"><a href="#cb20-3" aria-hidden="true" tabindex="-1"></a> is_reference_v&lt;iter_reference_t&lt;I&gt;&gt; ||</span>
<span id="cb20-4"><a href="#cb20-4" aria-hidden="true" tabindex="-1"></a> constructible_from&lt;iter_value_t&lt;I&gt;, iter_reference_t&lt;I&gt;&gt;)</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">4</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp">holds_alternative<span class="op">&lt;</span>I<span class="op">&gt;(</span>v_<span class="op">)</span></code>
is <code class="sourceCode cpp"><span class="kw">true</span></code>.</p>
</blockquote>
<h3 data-number="3.4.5" id="common_iteratoroperator-2"><span class="header-section-number">3.4.5</span> <code class="sourceCode cpp">common_iterator<span class="op">::</span><span class="kw">operator</span><span class="op">++</span></code><a href="#common_iteratoroperator-2" class="self-link"></a></h3>
<p>Modify <span>24.5.5.5
<a href="https://wg21.link/common.iter.nav">[common.iter.nav]</a></span>
paragraph 1 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb21"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb21-1"><a href="#cb21-1" aria-hidden="true" tabindex="-1"></a>constexpr common_iterator&amp; operator++();</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp">holds_alternative<span class="op">&lt;</span>I<span class="op">&gt;(</span>v_<span class="op">)</span></code>
is <code class="sourceCode cpp"><span class="kw">true</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Effects</em>: Equivalent to <code class="sourceCode cpp"><span class="op">++</span>get<span class="op">&lt;</span>I<span class="op">&gt;(</span>v_<span class="op">)</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">3</a></span>
<em>Returns</em>: <code class="sourceCode cpp"><span class="op">*</span><span class="kw">this</span></code>.</p>
</blockquote>
<h3 data-number="3.4.6" id="common_iteratoroperatorint"><span class="header-section-number">3.4.6</span> <code class="sourceCode cpp">common_iterator<span class="op">::</span><span class="kw">operator</span><span class="op">++(</span><span class="dt">int</span><span class="op">)</span></code><a href="#common_iteratoroperatorint" class="self-link"></a></h3>
<p>Modify <span>24.5.5.5
<a href="https://wg21.link/common.iter.nav">[common.iter.nav]</a></span>
paragraph 4 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb22"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb22-1"><a href="#cb22-1" aria-hidden="true" tabindex="-1"></a>constexpr decltype(auto) operator++(int);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">4</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp">holds_alternative<span class="op">&lt;</span>I<span class="op">&gt;(</span>v_<span class="op">)</span></code>
is <code class="sourceCode cpp"><span class="kw">true</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">5</a></span>
<em>Effects</em>: If <code class="sourceCode cpp">I</code> models
<code class="sourceCode cpp">forward_iterator</code>, equivalent to:</p>
<div class="sourceCode" id="cb23"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb23-1"><a href="#cb23-1" aria-hidden="true" tabindex="-1"></a>common_iterator tmp = *this;</span>
<span id="cb23-2"><a href="#cb23-2" aria-hidden="true" tabindex="-1"></a>++*this;</span>
<span id="cb23-3"><a href="#cb23-3" aria-hidden="true" tabindex="-1"></a>return tmp;</span></code></pre></div>
</blockquote>
<h3 data-number="3.4.7" id="operatorconst-common_iterator-const-common_iteratori2-s2"><span class="header-section-number">3.4.7</span> <code class="sourceCode cpp"><span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> common_iterator<span class="op">&amp;</span>, <span class="kw">const</span> common_iterator<span class="op">&lt;</span>I2, S2<span class="op">&gt;&amp;)</span></code><a href="#operatorconst-common_iterator-const-common_iteratori2-s2" class="self-link"></a></h3>
<p>Modify <span>24.5.5.6
<a href="https://wg21.link/common.iter.cmp">[common.iter.cmp]</a></span>
paragraphs 1 and 3 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb24"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb24-1"><a href="#cb24-1" aria-hidden="true" tabindex="-1"></a>template&lt;class I2, sentinel_for&lt;I&gt; S2&gt;</span>
<span id="cb24-2"><a href="#cb24-2" aria-hidden="true" tabindex="-1"></a>  requires sentinel_for&lt;S, I2&gt;</span>
<span id="cb24-3"><a href="#cb24-3" aria-hidden="true" tabindex="-1"></a>friend constexpr bool operator==(</span>
<span id="cb24-4"><a href="#cb24-4" aria-hidden="true" tabindex="-1"></a>  const common_iterator&amp; x, const common_iterator&lt;I2, S2&gt;&amp; y);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp">x<span class="op">.</span>v_<span class="op">.</span>valueless_by_exception<span class="op">()</span></code>
and <code class="sourceCode cpp">y<span class="op">.</span>v_<span class="op">.</span>valueless_by_exception<span class="op">()</span></code>
are each
<code class="sourceCode cpp"><span class="kw">false</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Returns</em>:
<code class="sourceCode cpp"><span class="kw">true</span></code> if
<code class="sourceCode cpp">i <span class="op">==</span> j</code>, and
otherwise <code class="sourceCode cpp">get<span class="op">&lt;</span>i<span class="op">&gt;(</span>x<span class="op">.</span>v_<span class="op">)</span> <span class="op">==</span> get<span class="op">&lt;</span>j<span class="op">&gt;(</span>y<span class="op">.</span>v_<span class="op">)</span></code>,
where <code class="sourceCode cpp">i</code> is <code class="sourceCode cpp">x<span class="op">.</span>v_<span class="op">.</span>index<span class="op">()</span></code>
and <code class="sourceCode cpp">j</code> is <code class="sourceCode cpp">y<span class="op">.</span>v_<span class="op">.</span>index<span class="op">()</span></code>.</p>
<div class="sourceCode" id="cb25"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb25-1"><a href="#cb25-1" aria-hidden="true" tabindex="-1"></a>template&lt;class I2, sentinel_for&lt;I&gt; S2&gt;</span>
<span id="cb25-2"><a href="#cb25-2" aria-hidden="true" tabindex="-1"></a>  requires sentinel_for&lt;S, I2&gt; &amp;&amp; equality_comparable_with&lt;I, I2&gt;</span>
<span id="cb25-3"><a href="#cb25-3" aria-hidden="true" tabindex="-1"></a>friend constexpr bool operator==(</span>
<span id="cb25-4"><a href="#cb25-4" aria-hidden="true" tabindex="-1"></a>  const common_iterator&amp; x, const common_iterator&lt;I2, S2&gt;&amp; y);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">3</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp">x<span class="op">.</span>v_<span class="op">.</span>valueless_by_exception<span class="op">()</span></code>
and <code class="sourceCode cpp">y<span class="op">.</span>v_<span class="op">.</span>valueless_by_exception<span class="op">()</span></code>
are each
<code class="sourceCode cpp"><span class="kw">false</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">4</a></span>
<em>Returns</em>:
<code class="sourceCode cpp"><span class="kw">true</span></code> if
<code class="sourceCode cpp">i</code> and
<code class="sourceCode cpp">j</code> are each
<code class="sourceCode cpp"><span class="dv">1</span></code>, and
otherwise <code class="sourceCode cpp">get<span class="op">&lt;</span>i<span class="op">&gt;(</span>x<span class="op">.</span>v_<span class="op">)</span> <span class="op">==</span> get<span class="op">&lt;</span>j<span class="op">&gt;(</span>y<span class="op">.</span>v_<span class="op">)</span></code>,
where <code class="sourceCode cpp">i</code> is <code class="sourceCode cpp">x<span class="op">.</span>v_<span class="op">.</span>index<span class="op">()</span></code>
and <code class="sourceCode cpp">j</code> is <code class="sourceCode cpp">y<span class="op">.</span>v_<span class="op">.</span>index<span class="op">()</span></code>.</p>
</blockquote>
<h3 data-number="3.4.8" id="operator-const-common_iterator-const-common_iteratori2-s2"><span class="header-section-number">3.4.8</span> <code class="sourceCode cpp"><span class="kw">operator</span><span class="op">-(</span><span class="kw">const</span> common_iterator<span class="op">&amp;</span>, <span class="kw">const</span> common_iterator<span class="op">&lt;</span>I2, S2<span class="op">&gt;&amp;)</span></code><a href="#operator-const-common_iterator-const-common_iteratori2-s2" class="self-link"></a></h3>
<p>Modify <span>24.5.5.6
<a href="https://wg21.link/common.iter.cmp">[common.iter.cmp]</a></span>
paragraph 5 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb26"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb26-1"><a href="#cb26-1" aria-hidden="true" tabindex="-1"></a>template&lt;sized_sentinel_for&lt;I&gt; I2, sized_sentinel_for&lt;I&gt; S2&gt;</span>
<span id="cb26-2"><a href="#cb26-2" aria-hidden="true" tabindex="-1"></a>  requires sized_sentinel_for&lt;S, I2&gt;</span>
<span id="cb26-3"><a href="#cb26-3" aria-hidden="true" tabindex="-1"></a>friend constexpr iter_difference_t&lt;I2&gt; operator-(</span>
<span id="cb26-4"><a href="#cb26-4" aria-hidden="true" tabindex="-1"></a>  const common_iterator&amp; x, const common_iterator&lt;I2, S2&gt;&amp; y);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">5</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp">x<span class="op">.</span>v_<span class="op">.</span>valueless_by_exception<span class="op">()</span></code>
and <code class="sourceCode cpp">y<span class="op">.</span>v_<span class="op">.</span>valueless_by_exception<span class="op">()</span></code>
are each
<code class="sourceCode cpp"><span class="kw">false</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">6</a></span>
<em>Returns</em>:
<code class="sourceCode cpp"><span class="dv">0</span></code> if
<code class="sourceCode cpp">i</code> and
<code class="sourceCode cpp">j</code> are each
<code class="sourceCode cpp"><span class="dv">1</span></code>, and
otherwise <code class="sourceCode cpp">get<span class="op">&lt;</span>i<span class="op">&gt;(</span>x<span class="op">.</span>v_<span class="op">)</span> <span class="op">-</span> get<span class="op">&lt;</span>j<span class="op">&gt;(</span>y<span class="op">.</span>v_<span class="op">)</span></code>,
where <code class="sourceCode cpp">i</code> is <code class="sourceCode cpp">x<span class="op">.</span>v_<span class="op">.</span>index<span class="op">()</span></code>
and <code class="sourceCode cpp">j</code> <code class="sourceCode cpp">is y<span class="op">.</span>v_<span class="op">.</span>index<span class="op">()</span></code>.</p>
</blockquote>
<h3 data-number="3.4.9" id="iter_moveconst-common_iterator"><span class="header-section-number">3.4.9</span> <code class="sourceCode cpp">iter_move<span class="op">(</span><span class="kw">const</span> common_iterator<span class="op">&amp;)</span></code><a href="#iter_moveconst-common_iterator" class="self-link"></a></h3>
<p>Modify <span>24.5.5.7
<a href="https://wg21.link/common.iter.cust">[common.iter.cust]</a></span>
paragraph 1 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb27"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb27-1"><a href="#cb27-1" aria-hidden="true" tabindex="-1"></a>friend constexpr decltype(auto) iter_move(const common_iterator&amp; i)</span>
<span id="cb27-2"><a href="#cb27-2" aria-hidden="true" tabindex="-1"></a>  noexcept(noexcept(ranges::iter_move(declval&lt;const I&amp;&gt;())))</span>
<span id="cb27-3"><a href="#cb27-3" aria-hidden="true" tabindex="-1"></a>    requires input_iterator&lt;I&gt;;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp">holds_alternative<span class="op">&lt;</span>I<span class="op">&gt;(</span>i<span class="op">.</span>v_<span class="op">)</span></code>
is <code class="sourceCode cpp"><span class="kw">true</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Effects</em>: Equivalent to: <code class="sourceCode cpp"><span class="cf">return</span> ranges<span class="op">::</span>iter_move<span class="op">(</span>get<span class="op">&lt;</span>I<span class="op">&gt;(</span>i<span class="op">.</span>v_<span class="op">))</span>;</code></p>
</blockquote>
<h3 data-number="3.4.10" id="iter_swapconst-common_iterator-const-common_iteratori2-s2"><span class="header-section-number">3.4.10</span> <code class="sourceCode cpp">iter_swap<span class="op">(</span><span class="kw">const</span> common_iterator<span class="op">&amp;</span>, <span class="kw">const</span> common_iterator<span class="op">&lt;</span>I2, S2<span class="op">&gt;&amp;)</span></code><a href="#iter_swapconst-common_iterator-const-common_iteratori2-s2" class="self-link"></a></h3>
<p>Modify <span>24.5.5.7
<a href="https://wg21.link/common.iter.cust">[common.iter.cust]</a></span>
paragraph 3 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb28"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb28-1"><a href="#cb28-1" aria-hidden="true" tabindex="-1"></a>template&lt;indirectly_swappable&lt;I&gt; I2, class S2&gt;</span>
<span id="cb28-2"><a href="#cb28-2" aria-hidden="true" tabindex="-1"></a>  friend constexpr void iter_swap(const common_iterator&amp; x, const common_iterator&lt;I2, S2&gt;&amp; y)</span>
<span id="cb28-3"><a href="#cb28-3" aria-hidden="true" tabindex="-1"></a>    noexcept(noexcept(ranges::iter_swap(declval&lt;const I&amp;&gt;(), declval&lt;const I2&amp;&gt;())));</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">3</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp">holds_alternative<span class="op">&lt;</span>I<span class="op">&gt;(</span>x<span class="op">.</span>v_<span class="op">)</span></code>
and <code class="sourceCode cpp">holds_alternative<span class="op">&lt;</span>I2<span class="op">&gt;(</span>y<span class="op">.</span>v_<span class="op">)</span></code>
are each
<code class="sourceCode cpp"><span class="kw">true</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">4</a></span>
<em>Effects</em>: Equivalent to <code class="sourceCode cpp">ranges<span class="op">::</span>iter_swap<span class="op">(</span>get<span class="op">&lt;</span>I<span class="op">&gt;(</span>x<span class="op">.</span>v_<span class="op">)</span></code>,
<code class="sourceCode cpp">get<span class="op">&lt;</span>I2<span class="op">&gt;(</span>y<span class="op">.</span>v_<span class="op">))</span></code>.</p>
</blockquote>
<h2 data-number="3.5" id="basic_stacktrace-1"><span class="header-section-number">3.5</span>
<code class="sourceCode cpp">basic_stacktrace</code><a href="#basic_stacktrace-1" class="self-link"></a></h2>
<h3 data-number="3.5.1" id="basic_stacktracecurrent"><span class="header-section-number">3.5.1</span> <code class="sourceCode cpp">basic_stacktrace<span class="op">::</span>current</code><a href="#basic_stacktracecurrent" class="self-link"></a></h3>
<p>Modify <span>19.6.4.2
<a href="https://wg21.link/stacktrace.basic.cons">[stacktrace.basic.cons]</a></span>
paragraph 5 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb29"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb29-1"><a href="#cb29-1" aria-hidden="true" tabindex="-1"></a>static basic_stacktrace current(size_type skip, size_type max_depth,</span>
<span id="cb29-2"><a href="#cb29-2" aria-hidden="true" tabindex="-1"></a>                                const allocator_type&amp; alloc = allocator_type()) noexcept;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">4</a></span>
Let <code class="sourceCode cpp">t</code> be a stacktrace as-if obtained
via <code class="sourceCode cpp">basic_stacktrace<span class="op">::</span>current<span class="op">(</span>alloc<span class="op">)</span></code>.
Let <code class="sourceCode cpp">n</code> be <code class="sourceCode cpp">t<span class="op">.</span>size<span class="op">()</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">5</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp">skip <span class="op">&lt;=</span> skip <span class="op">+</span> max_depth</code>
is <code class="sourceCode cpp"><span class="kw">true</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">6</a></span>
<em>Returns</em>: A <code class="sourceCode cpp">basic_stacktrace</code>
object where <code class="sourceCode cpp">frames_</code> is
direct-non-list-initialized from arguments <code class="sourceCode cpp">t<span class="op">.</span>begin<span class="op">()</span> <span class="op">+</span> min<span class="op">(</span>n, skip<span class="op">)</span>, t<span class="op">.</span>begin<span class="op">()</span> <span class="op">+</span> min<span class="op">(</span>n, skip <span class="op">+</span> max_depth<span class="op">)</span></code>,
and <code class="sourceCode cpp">alloc</code>, or an empty
<code class="sourceCode cpp">basic_stacktrace</code> object if the
initialization of <code class="sourceCode cpp">frames_</code>
failed.</p>
</blockquote>
<h3 data-number="3.5.2" id="basic_stacktraceoperator"><span class="header-section-number">3.5.2</span> <code class="sourceCode cpp">basic_stacktrace<span class="op">::</span><span class="kw">operator</span><span class="op">[]</span></code><a href="#basic_stacktraceoperator" class="self-link"></a></h3>
<p>Modify <span>19.6.4.3
<a href="https://wg21.link/stacktrace.basic.obs">[stacktrace.basic.obs]</a></span>
paragraph 10 as indicated:</p>
<blockquote>
<div class="sourceCode" id="cb30"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb30-1"><a href="#cb30-1" aria-hidden="true" tabindex="-1"></a>const_reference operator[](size_type frame_no) const;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">10</a></span>
<em><span class="add" style="color: #006e28"><ins>Hardened</ins></span>
<span class="rm" style="color: #bf0303"><del>P</del></span><span class="add" style="color: #006e28"><ins>p</ins></span>reconditions</em>:
<code class="sourceCode cpp">frame_no <span class="op">&lt;</span> size<span class="op">()</span></code>
is <code class="sourceCode cpp"><span class="kw">true</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">11</a></span>
<em>Returns</em>: <code class="sourceCode cpp">frames_<span class="op">[</span>frame_no<span class="op">]</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">12</a></span>
<em>Throws</em>: Nothing.</p>
</blockquote>
<h2 data-number="3.6" id="feature-test-macros"><span class="header-section-number">3.6</span> Feature-test macros<a href="#feature-test-macros" class="self-link"></a></h2>
<p>Modify <span>17.3.2
<a href="https://wg21.link/version.syn">[version.syn]</a></span>
paragraph 3 as indicated:</p>
<blockquote>
<p><span class="marginalizedparent"><a class="marginalized">3</a></span>
Additionally, each of the following macros are defined in a hardened
implementation:</p>
</blockquote>
<div>
<div class="sourceCode" id="cb31"><pre class="sourceCode diff"><code class="sourceCode diff"><span id="cb31-1"><a href="#cb31-1" aria-hidden="true" tabindex="-1"></a>#define __cpp_lib_hardened_array                    202502L // also in &lt;array&gt;</span>
<span id="cb31-2"><a href="#cb31-2" aria-hidden="true" tabindex="-1"></a><span class="va">+ #define __cpp_lib_hardened_basic_stacktrace       202???L // also in &lt;stacktrace&gt;</span></span>
<span id="cb31-3"><a href="#cb31-3" aria-hidden="true" tabindex="-1"></a>#define __cpp_lib_hardened_basic_string             202502L // also in &lt;string&gt;</span>
<span id="cb31-4"><a href="#cb31-4" aria-hidden="true" tabindex="-1"></a>#define __cpp_lib_hardened_basic_string_view        202502L // also in &lt;string_view&gt;</span>
<span id="cb31-5"><a href="#cb31-5" aria-hidden="true" tabindex="-1"></a>#define __cpp_lib_hardened_bitset                   202502L // also in &lt;bitset&gt;</span>
<span id="cb31-6"><a href="#cb31-6" aria-hidden="true" tabindex="-1"></a><span class="va">+ #define __cpp_lib_hardened_common_iterator        202???L // also in &lt;iterator&gt;</span></span>
<span id="cb31-7"><a href="#cb31-7" aria-hidden="true" tabindex="-1"></a><span class="va">+ #define __cpp_lib_hardened_counted_iterator       202???L // also in &lt;iterator&gt;</span></span>
<span id="cb31-8"><a href="#cb31-8" aria-hidden="true" tabindex="-1"></a>#define __cpp_lib_hardened_deque                    202502L // also in &lt;deque&gt;</span>
<span id="cb31-9"><a href="#cb31-9" aria-hidden="true" tabindex="-1"></a>#define __cpp_lib_hardened_expected                 202502L // also in &lt;expected&gt;</span>
<span id="cb31-10"><a href="#cb31-10" aria-hidden="true" tabindex="-1"></a>#define __cpp_lib_hardened_forward_list             202502L // also in &lt;forward_list&gt;</span>
<span id="cb31-11"><a href="#cb31-11" aria-hidden="true" tabindex="-1"></a>#define __cpp_lib_hardened_inplace_vector           202502L // also in &lt;inplace_vector&gt;</span>
<span id="cb31-12"><a href="#cb31-12" aria-hidden="true" tabindex="-1"></a>#define __cpp_lib_hardened_list                     202502L // also in &lt;list&gt;</span>
<span id="cb31-13"><a href="#cb31-13" aria-hidden="true" tabindex="-1"></a>#define __cpp_lib_hardened_mdspan                   202502L // also in &lt;mdspan&gt;</span>
<span id="cb31-14"><a href="#cb31-14" aria-hidden="true" tabindex="-1"></a>#define __cpp_lib_hardened_optional                 202502L // also in &lt;optional&gt;</span>
<span id="cb31-15"><a href="#cb31-15" aria-hidden="true" tabindex="-1"></a><span class="va">+ #define __cpp_lib_hardened_shared_ptr_array       202???L // also in &lt;memory&gt;</span></span>
<span id="cb31-16"><a href="#cb31-16" aria-hidden="true" tabindex="-1"></a>#define __cpp_lib_hardened_span                     202502L // also in &lt;span&gt;</span>
<span id="cb31-17"><a href="#cb31-17" aria-hidden="true" tabindex="-1"></a>#define __cpp_lib_hardened_valarray                 202502L // also in &lt;valarray&gt;</span>
<span id="cb31-18"><a href="#cb31-18" aria-hidden="true" tabindex="-1"></a>#define __cpp_lib_hardened_vector                   202502L // also in &lt;vector&gt;</span>
<span id="cb31-19"><a href="#cb31-19" aria-hidden="true" tabindex="-1"></a><span class="va">+ #define __cpp_lib_hardened_view_interface         202???L // also in &lt;ranges&gt;</span></span></code></pre></div>
</div>
</div>
</div>
</body>
</html>
