<!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="2023-05-15" />
  <meta name="keywords" content="C++,cplusplus,wg21,EWGI,LEWGI,deprecated,C++26,Annex
D" />
  <meta name="description" content="Review of the deprecated features in C++23 for their continuing applicability in C++26" />
  <title>Review Annex D for C++26</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">Review Annex D for
C++26</h1>
<h3 class="subtitle" style="text-align:center">Recommendations to remove
or undeprecate specific features</h3>
<table style="border:none;float:right">
  <tr>
    <td>Document #:</td>
    <td>P2863R0</td>
  </tr>
  <tr>
    <td>Date:</td>
    <td>2023-05-15</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>
      EWGI,LEWGI,SG1<br>
    </td>
  </tr>
  <tr>
    <td style="vertical-align:top">Reply-to:</td>
    <td>
      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">
<div id="TOC" role="doc-toc">
<h1 id="toctitle">Contents</h1>
<ul>
<li><a href="#abstract" id="toc-abstract"><span class="toc-section-number">1</span> Abstract<span></span></a></li>
<li><a href="#revisions" id="toc-revisions"><span class="toc-section-number">2</span> Revision History<span></span></a>
<ul>
<li><a href="#april-mailing-pre-varna" id="toc-april-mailing-pre-varna"><span class="toc-section-number">2.1</span> 2023 April mailing
(pre-Varna)<span></span></a></li>
</ul></li>
<li><a href="#outline" id="toc-outline"><span class="toc-section-number">3</span> Outline<span></span></a></li>
<li><a href="#methodology" id="toc-methodology"><span class="toc-section-number">4</span> Methodology<span></span></a></li>
<li><a href="#checklists" id="toc-checklists"><span class="toc-section-number">5</span> Checklist For
Recommendations<span></span></a>
<ul>
<li><a href="#checklists.core" id="toc-checklists.core"><span class="toc-section-number">5.1</span> Core<span></span></a></li>
<li><a href="#checklists.library" id="toc-checklists.library"><span class="toc-section-number">5.2</span> Library<span></span></a></li>
</ul></li>
<li><a href="#reviews" id="toc-reviews"><span class="toc-section-number">6</span> Review By Clause<span></span></a>
<ul>
<li><a href="#D.1" id="toc-D.1"><span class="toc-section-number">6.1</span> General
[depr.general]<span></span></a></li>
<li><a href="#D.2" id="toc-D.2"><span class="toc-section-number">6.2</span> Arithmetic conversion on
enumerations [depr.arith.conv.enum]<span></span></a></li>
<li><a href="#D.3" id="toc-D.3"><span class="toc-section-number">6.3</span> Implicit capture of
<code class="sourceCode default">*this</code> by reference
[depr.capture.this]<span></span></a></li>
<li><a href="#D.4" id="toc-D.4"><span class="toc-section-number">6.4</span> Array comparisons
[depr.array.comp]<span></span></a></li>
<li><a href="#D.5" id="toc-D.5"><span class="toc-section-number">6.5</span> Deprecated
<code class="sourceCode default">volatile</code> types
[depr.volatile.type]<span></span></a></li>
<li><a href="#D.6" id="toc-D.6"><span class="toc-section-number">6.6</span> Redeclaration of
<code class="sourceCode default">static constexpr</code> data members
[depr.static.constexpr]<span></span></a></li>
<li><a href="#D.7" id="toc-D.7"><span class="toc-section-number">6.7</span> Non-local use of TU-local entities
[depr.local]<span></span></a></li>
<li><a href="#D.8" id="toc-D.8"><span class="toc-section-number">6.8</span> Implicit declaration of copy
functions [depr.impldec]<span></span></a></li>
<li><a href="#D.9" id="toc-D.9"><span class="toc-section-number">6.9</span> Literal operator function
declarations using an identifier [depr.lit]<span></span></a></li>
<li><a href="#D.10" id="toc-D.10"><span class="toc-section-number">6.10</span>
<code class="sourceCode default">template</code> keyword before
qualified names [depr.template.template]<span></span></a></li>
<li><a href="#requires-paragraph-depr.res.on.required" id="toc-requires-paragraph-depr.res.on.required"><span class="toc-section-number">6.11</span> Requires paragraph <span id="D.11">depr.res.on.required</span><span></span></a></li>
<li><a href="#D.12" id="toc-D.12"><span class="toc-section-number">6.12</span>
<code class="sourceCode default">has_denorm</code> members in
<code class="sourceCode default">numeric_limits</code>
[depr.numeric.limits.has.denorm]<span></span></a></li>
<li><a href="#D.13" id="toc-D.13"><span class="toc-section-number">6.13</span> Deprecated C macros
[depr.c.macros]<span></span></a></li>
<li><a href="#D.14" id="toc-D.14"><span class="toc-section-number">6.14</span> Relational operators
[depr.relops]<span></span></a></li>
<li><a href="#D.15" id="toc-D.15"><span class="toc-section-number">6.15</span>
<code class="sourceCode default">char *</code> streams
[depr.str.strstreams]<span></span></a></li>
<li><a href="#D.16" id="toc-D.16"><span class="toc-section-number">6.16</span> Deprecated error numbers
[depr.cerrno]<span></span></a></li>
<li><a href="#D.17" id="toc-D.17"><span class="toc-section-number">6.17</span> The default allocator
[depr.default.allocator]<span></span></a></li>
<li><a href="#D.18" id="toc-D.18"><span class="toc-section-number">6.18</span> Deprecated
<code class="sourceCode default">polymorphic_allocator</code> member
function [depr.mem.poly.allocator.mem]<span></span></a></li>
<li><a href="#D.19" id="toc-D.19"><span class="toc-section-number">6.19</span> Deprecated type traits
[depr.meta.types]<span></span></a>
<ul>
<li><a href="#deployment" id="toc-deployment"><span class="toc-section-number">6.19.1</span>
Deployment<span></span></a></li>
</ul></li>
<li><a href="#D.20" id="toc-D.20"><span class="toc-section-number">6.20</span> Tuple
[depr.tuple]<span></span></a></li>
<li><a href="#D.21" id="toc-D.21"><span class="toc-section-number">6.21</span> Variant
[depr.variant]<span></span></a></li>
<li><a href="#D.22" id="toc-D.22"><span class="toc-section-number">6.22</span> Deprecated
<code class="sourceCode default">iterator</code> class template
[depr.iterator]<span></span></a>
<ul>
<li><a href="#initial-review-telecon-20200713" id="toc-initial-review-telecon-20200713"><span class="toc-section-number">6.22.1</span> Initial Review: telecon
2020/07/13<span></span></a></li>
</ul></li>
<li><a href="#D.23" id="toc-D.23"><span class="toc-section-number">6.23</span> Deprecated
<code class="sourceCode default">move_iterator</code> access
[depr.move.iter.elem]<span></span></a></li>
<li><a href="#D.24" id="toc-D.24"><span class="toc-section-number">6.24</span> Deprecated
<code class="sourceCode default">shared_ptr</code> atomic access
[depr.util.smartptr.shared.atomic]<span></span></a></li>
<li><a href="#D.25" id="toc-D.25"><span class="toc-section-number">6.25</span> Deprecated
<code class="sourceCode default">basic_string</code> capacity
[depr.string.capacity]<span></span></a></li>
<li><a href="#D.26" id="toc-D.26"><span class="toc-section-number">6.26</span> Deprecated standard code
conversion facets [depr.locale.stdcvt]<span></span></a></li>
<li><a href="#D.27" id="toc-D.27"><span class="toc-section-number">6.27</span> Deprecated convenience conversion
interfaces [depr.conversions]<span></span></a></li>
<li><a href="#D.28" id="toc-D.28"><span class="toc-section-number">6.28</span> Deprecated locale category facets
[depr.locale.category]<span></span></a></li>
<li><a href="#D.29" id="toc-D.29"><span class="toc-section-number">6.29</span> Deprecated filesystem path
factory functions [depr.fs.path.factory]<span></span></a></li>
<li><a href="#D.30" id="toc-D.30"><span class="toc-section-number">6.30</span> Deprecated atomic operations
[depr.atomics]<span></span></a></li>
</ul></li>
<li><a href="#ack" id="toc-ack"><span class="toc-section-number">7</span>
Acknowledgements<span></span></a></li>
<li><a href="#bibliography" id="toc-bibliography"><span class="toc-section-number">8</span> References<span></span></a></li>
</ul>
</div>
<!-- RENDERING:
     This paper should be rendered as html, rather than pdf, due to poor
     formatting of the main table in the generated LaTeX.

     Also, the column widths of the html tables deduce badly after translation
     from markdown, and should be manually patched before publishing the final
     paper.
-->
<h1 data-number="1" id="abstract"><span class="header-section-number">1</span> Abstract<a href="#abstract" class="self-link"></a></h1>
<p>This paper evaluates all the deprecated facilities of the C++23
Standard and recommends removing a subset from Annex D in C++26, either
by removal from the Standard entirely or by undeprecation and restoring
the subset to the main text. Such recommendations will be pursued in
specific papers, and this paper acts as an index into that work.</p>
<h1 data-number="2" id="revisions"><span class="header-section-number">2</span> Revision History<a href="#revisions" class="self-link"></a></h1>
<h2 data-number="2.1" id="april-mailing-pre-varna"><span class="header-section-number">2.1</span> 2023 April mailing
(pre-Varna)<a href="#april-mailing-pre-varna" class="self-link"></a></h2>
<p>Initial draft of this paper.</p>
<h1 data-number="3" id="outline"><span class="header-section-number">3</span> Outline<a href="#outline" class="self-link"></a></h1>
<p>With the release of a new C++ Standard, we get an opportunity to
revisit the features identified for deprecation, and consider if we are
prepared to clear any out yet, either by removing completely from the
standard, or by reversing the deprecation decision and restoring the
feature to full service. This paper makes no attempt to offer proposals
for removing features other than those deprecated in Annex D, nor does
it attempt to identify new candidates for deprecation.</p>
<p>In an ideal world, the start of every release cycle would cleanse the
list of deprecated features entirely, allowing the language and library
to evolve cleanly without holding too much dead-weight. It should be
noted that only two of the current twenty-nine deprecated feature were
deprecated prior to C++17, as we have made good progress are resolving
long-standing deprecations. However, the desire to support customers and
not needlessly break their code makes a full clear-out impractical. This
paper continues the tradition of maintaining a single paper to focus
attention of efficiently reviewing the case for and against removal, or
undeprecation, of each deprecated feature of the just-published
standard, the meeting after that standard has been sent to ISO for the
final publication ballot.</p>
<p>In contrast to previous years, all work to change the status of a
feature, by removal or undeprecation, will be delegated to a paper on
that feature. Thus, work proceeds on each feature without delaying
everything to the pace of the slowest feature and the author’s ability
to update this summary paper in a timely manner. Note that many reviews
will still be processed by this paper, where no further action is
intended on a feature for C++26.</p>
<p>The benefits of making the choice to remove features early in a
standard cycle is that we will get the most experience we can from the
bleeding-edge adopters whether a particular removal is more problematic
than expected - but even this data point is limited, as bleeding-edge
adopters typically have less reliance on deprecated features, eagerly
adopting the newer replacement facilities.</p>
<p>However, do note that with the three year release cadence for the C++
Standard, we will often be re-evaluating features whose deprecated
status has barely reached print.</p>
<p>We have precedent that Core language features are good targets for
removal, typically taking two standard cycles to remove a deprecated
feature, although often prepared to entirely remove a feature even
without a period of deprecation, if the cause is strong enough.</p>
<p>The library experience has been mixed, with no desire to remove
anything without a period of deprecation (other than
<code class="sourceCode default">gets</code>) and no precedent prior to
C++17 for actually removing deprecated features.</p>
<p>Informal feedback on library deprecation when performing these
reviews for previous standards leans in two directions: deprecation is
for life, and we should never remove anything, as there is no reason for
the library to ever break client code; and alternatively with the
addition of zombie names there is clear intent library vendors should
continue supporting deprecated features as long as their customers
demand them, without violating conformance, and that removal from the
standard removes maintenance costs from wg21 (placed instead on library
vendors) and that this paper should be aggressive in its recommendations
to remove deprecated features.</p>
<h1 data-number="4" id="methodology"><span class="header-section-number">4</span> Methodology<a href="#methodology" class="self-link"></a></h1>
<p>We will review each deprecated facility, and make a recommendation to
either remove that feature, undeprecate that feature, or take no action.
A recommendation to remove or undeprecate will delegate that work to a
follow-up paper, tracked by a checklist below. The author provides
several papers that do just that for features where the abandoned review
for C++23 had expressed a strong intent to remove. In other cases
“Request Paper” is indicated, which would be the result of evolution
review wanting to proceed with undeprecation or removal that the current
author does not have the resources to pursue.</p>
<h1 data-number="5" id="checklists"><span class="header-section-number">5</span> Checklist For Recommendations<a href="#checklists" class="self-link"></a></h1>
<p>This table will track progress of all papers targeting features
deprecated in the C++23 Standard, according to the last public draft,
<span class="citation" data-cites="N4944">[<a href="#ref-N4944" role="doc-biblioref">N4944</a>]</span>. As such, the subclause
references will not update if new deprecations occur during C++26, as we
track only the features deprecated in the current published
standard.</p>
<p>It notes the standard that introduced the feature; the standard and
paper that deprecated that feature; the current recommendation of action
to take, with a reference to the delegated paper that will propose those
changes; and the current working group that has ownership of that
review. Any recommendation of “No action” means the review is in this
paper.</p>
<p>Once the review of a feature is completed, either by confirming No
action or adopting a reviewed paper in plenary, the Owner will change to
Done.</p>
<p>The recommendations in R0 of this paper are tentative, pending EWG,
LEWG, and SG1 review, and should become an accurate record of intent
following the 2023 Varna meeting.</p>
<h2 data-number="5.1" id="checklists.core"><span class="header-section-number">5.1</span> Core<a href="#checklists.core" class="self-link"></a></h2>
<table>
<colgroup>
<col style="width: 14%" />
<col style="width: 11%" />
<col style="width: 15%" />
<col style="width: 15%" />
<col style="width: 12%" />
<col style="width: 22%" />
<col style="width: 7%" />
</colgroup>
<thead>
<tr class="header">
<th><div style="text-align:center">
<strong>Subclause</strong>
</div></th>
<th><div style="text-align:center">
<strong>Feature</strong>
</div></th>
<th><div style="text-align:center">
<strong>Introduced</strong>
</div></th>
<th><div style="text-align:center">
<strong>Deprecated</strong>
</div></th>
<th><div style="text-align:center">
<strong>By Paper</strong>
</div></th>
<th><div style="text-align:center">
<strong>Recommendation</strong>
</div></th>
<th><div style="text-align:center">
<strong>Owner</strong>
</div></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><a href="#D.2">D.2</a></td>
<td>Arithmetic conversion on enumerations</td>
<td>C++98</td>
<td>C++20</td>
<td><span class="citation" data-cites="P1120R0">[<a href="#ref-P1120R0" role="doc-biblioref">P1120R0</a>]</span></td>
<td>Remove: <span class="citation" data-cites="P2864R0">[<a href="#ref-P2864R0" role="doc-biblioref">P2864R0</a>]</span></td>
<td>EWGI</td>
</tr>
<tr class="even">
<td><a href="#D.3">D.3</a></td>
<td>Implicit capture of <code class="sourceCode default">*this</code> by
reference</td>
<td>C++11</td>
<td>C++20</td>
<td><span class="citation" data-cites="P0806R2">[<a href="#ref-P0806R2" role="doc-biblioref">P0806R2</a>]</span></td>
<td>No action</td>
<td>EWGI</td>
</tr>
<tr class="odd">
<td><a href="#D.4">D.4</a></td>
<td>Array comparisons</td>
<td>C++98</td>
<td>C++20</td>
<td><span class="citation" data-cites="P1120R0">[<a href="#ref-P1120R0" role="doc-biblioref">P1120R0</a>]</span></td>
<td>Remove: <span class="citation" data-cites="P2865R0">[<a href="#ref-P2865R0" role="doc-biblioref">P2865R0</a>]</span></td>
<td>EWGI</td>
</tr>
<tr class="even">
<td><a href="#D.5">D.5</a></td>
<td>Deprecated use of
<code class="sourceCode default">volatile</code></td>
<td>C++98</td>
<td>C++20</td>
<td><span class="citation" data-cites="P1152R4">[<a href="#ref-P1152R4" role="doc-biblioref">P1152R4</a>]</span></td>
<td>Address by <span class="citation" data-cites="P2866R0">[<a href="#ref-P2866R0" role="doc-biblioref">P2866R0</a>]</span></td>
<td>EWGI</td>
</tr>
<tr class="odd">
<td><a href="#D.6">D.6</a></td>
<td>Redeclare static <code class="sourceCode default">constexpr</code>
members</td>
<td>C++11</td>
<td>C++17</td>
<td><span class="citation" data-cites="P0386R2">[<a href="#ref-P0386R2" role="doc-biblioref">P0386R2</a>]</span></td>
<td>No action</td>
<td>EWGI</td>
</tr>
<tr class="even">
<td><a href="#D.7">D.7</a></td>
<td>Non-local use of TU-local entities</td>
<td>C++98</td>
<td>C++20</td>
<td><span class="citation" data-cites="P1815R2">[<a href="#ref-P1815R2" role="doc-biblioref">P1815R2</a>]</span></td>
<td>No action</td>
<td>EWGI</td>
</tr>
<tr class="odd">
<td><a href="#D.8">D.8</a></td>
<td>Implicit special members</td>
<td>C++98</td>
<td>C++11</td>
<td><span class="citation" data-cites="N3203">[<a href="#ref-N3203" role="doc-biblioref">N3203</a>]</span></td>
<td>Request paper</td>
<td>EWGI</td>
</tr>
<tr class="even">
<td><a href="#D.9">D.9</a></td>
<td>Some literal operator declarations</td>
<td>C++11</td>
<td>C++23</td>
<td>Core 2521</td>
<td>No action</td>
<td>EWGI</td>
</tr>
<tr class="odd">
<td><a href="#D.10">D.10</a></td>
<td><code class="sourceCode default">template</code> keyword before
qualified names</td>
<td>C++98</td>
<td>C++23</td>
<td><span class="citation" data-cites="P1787R6">[<a href="#ref-P1787R6" role="doc-biblioref">P1787R6</a>]</span></td>
<td>No action</td>
<td>EWGI</td>
</tr>
</tbody>
</table>
<h2 data-number="5.2" id="checklists.library"><span class="header-section-number">5.2</span> Library<a href="#checklists.library" class="self-link"></a></h2>
<table>
<colgroup>
<col style="width: 14%" />
<col style="width: 11%" />
<col style="width: 15%" />
<col style="width: 15%" />
<col style="width: 12%" />
<col style="width: 22%" />
<col style="width: 7%" />
</colgroup>
<thead>
<tr class="header">
<th><div style="text-align:center">
<strong>Subclause</strong>
</div></th>
<th><div style="text-align:center">
<strong>Feature</strong>
</div></th>
<th><div style="text-align:center">
<strong>Introduced</strong>
</div></th>
<th><div style="text-align:center">
<strong>Deprecated</strong>
</div></th>
<th><div style="text-align:center">
<strong>By Paper</strong>
</div></th>
<th><div style="text-align:center">
<strong>Recommendation</strong>
</div></th>
<th><div style="text-align:center">
<strong>Owner</strong>
</div></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><a href="#D.11">D.11</a></td>
<td><em>Requires:</em> clauses</td>
<td>C++98</td>
<td>C++20</td>
<td>Editorial</td>
<td>Remove: <span class="citation" data-cites="P2874R0">[<a href="#ref-P2874R0" role="doc-biblioref">P2874R0</a>]</span></td>
<td>LWG</td>
</tr>
<tr class="even">
<td><a href="#D.12">D.12</a></td>
<td><code class="sourceCode default">has_denorm</code> members in
<code class="sourceCode default">numeric_limits</code></td>
<td>C++98</td>
<td>C++23</td>
<td><span class="citation" data-cites="P2614R2">[<a href="#ref-P2614R2" role="doc-biblioref">P2614R2</a>]</span></td>
<td>No action</td>
<td>LEWGI</td>
</tr>
<tr class="odd">
<td><a href="#D.13">D.13</a></td>
<td>Deprecated C macros</td>
<td>C++98</td>
<td>C++23</td>
<td><span class="citation" data-cites="P2790R0">[<a href="#ref-P2790R0" role="doc-biblioref">P2790R0</a>]</span></td>
<td>No action</td>
<td>LEWGI</td>
</tr>
<tr class="even">
<td><a href="#D.14">D.14</a></td>
<td><code class="sourceCode default">relops</code></td>
<td>C++98</td>
<td>C++20</td>
<td><span class="citation" data-cites="P0768R1">[<a href="#ref-P0768R1" role="doc-biblioref">P0768R1</a>]</span></td>
<td>No action</td>
<td>LEWGI</td>
</tr>
<tr class="odd">
<td><a href="#D.15">D.15</a></td>
<td><code class="sourceCode default">char *</code> streams</td>
<td>C++98</td>
<td>C++98</td>
<td>N/A</td>
<td>Remove: <span class="citation" data-cites="P2867R0">[<a href="#ref-P2867R0" role="doc-biblioref">P2867R0</a>]</span></td>
<td>LEWGI</td>
</tr>
<tr class="even">
<td><a href="#D.16">D.16</a></td>
<td>Deprecated error numbers</td>
<td>C++11</td>
<td>C++23</td>
<td><span class="citation" data-cites="P2790R0">[<a href="#ref-P2790R0" role="doc-biblioref">P2790R0</a>]</span></td>
<td>No action</td>
<td>LEWGI</td>
</tr>
<tr class="odd">
<td><a href="#D.17">D.17</a></td>
<td>The default allocator</td>
<td>C++17</td>
<td>C++23</td>
<td>LWG 3170</td>
<td>Remove: <span class="citation" data-cites="P2868R0">[<a href="#ref-P2868R0" role="doc-biblioref">P2868R0</a>]</span></td>
<td>LEWGI</td>
</tr>
<tr class="even">
<td><a href="#D.18">D.18</a></td>
<td><code class="sourceCode default">polymorphic_allocator::destroy</code></td>
<td>C++17</td>
<td>C++23</td>
<td>LWG 3036</td>
<td>Undeprecate: <span class="citation" data-cites="P2864R0">[<a href="#ref-P2864R0" role="doc-biblioref">P2864R0</a>]</span></td>
<td>LEWGI</td>
</tr>
<tr class="odd">
<td><a href="#D.19">D.19</a></td>
<td>Deprecated type traits</td>
<td>C++11</td>
<td>C++20</td>
<td><span class="citation" data-cites="P0767R1">[<a href="#ref-P0767R1" role="doc-biblioref">P0767R1</a>]</span></td>
<td>No Action</td>
<td>LEWGI</td>
</tr>
<tr class="even">
<td></td>
<td></td>
<td>C++11</td>
<td>C++23</td>
<td><span class="citation" data-cites="P1413R3">[<a href="#ref-P1413R3" role="doc-biblioref">P1413R3</a>]</span></td>
<td></td>
<td></td>
</tr>
<tr class="odd">
<td><a href="#D.20">D.20</a></td>
<td><code class="sourceCode default">volatile</code> tuple API</td>
<td>C++11</td>
<td>C++20</td>
<td><span class="citation" data-cites="P1831R1">[<a href="#ref-P1831R1" role="doc-biblioref">P1831R1</a>]</span></td>
<td>Remove: <span class="citation" data-cites="P2866R0">[<a href="#ref-P2866R0" role="doc-biblioref">P2866R0</a>]</span></td>
<td>EWGI</td>
</tr>
<tr class="even">
<td><a href="#D.21">D.21</a></td>
<td><code class="sourceCode default">volatile</code> variant API</td>
<td>C++17</td>
<td>C++20</td>
<td><span class="citation" data-cites="P1831R1">[<a href="#ref-P1831R1" role="doc-biblioref">P1831R1</a>]</span></td>
<td>Remove: <span class="citation" data-cites="P2866R0">[<a href="#ref-P2866R0" role="doc-biblioref">P2866R0</a>]</span></td>
<td>EWGI</td>
</tr>
<tr class="odd">
<td><a href="#D.22">D.22</a></td>
<td><code class="sourceCode default">std::iterator</code></td>
<td>C++98</td>
<td>C++17</td>
<td><span class="citation" data-cites="P0174R2">[<a href="#ref-P0174R2" role="doc-biblioref">P0174R2</a>]</span></td>
<td>No action</td>
<td>LEWGI</td>
</tr>
<tr class="even">
<td><a href="#D.23">D.23</a></td>
<td><code class="sourceCode default">move_iterator::operator-&gt;</code></td>
<td>C++11</td>
<td>C++20</td>
<td><span class="citation" data-cites="P1252R2">[<a href="#ref-P1252R2" role="doc-biblioref">P1252R2</a>]</span></td>
<td>No action</td>
<td>LEWGI</td>
</tr>
<tr class="odd">
<td><a href="#D.24">D.24</a></td>
<td>C API to use <code class="sourceCode default">shared_ptr</code>
atomically</td>
<td>C++11</td>
<td>C++20</td>
<td><span class="citation" data-cites="P0718R2">[<a href="#ref-P0718R2" role="doc-biblioref">P0718R2</a>]</span></td>
<td>Remove: <span class="citation" data-cites="P2869R0">[<a href="#ref-P2869R0" role="doc-biblioref">P2869R0</a>]</span></td>
<td>SG1</td>
</tr>
<tr class="even">
<td><a href="#D.25">D.25</a></td>
<td><code class="sourceCode default">basic_string::reserve()</code></td>
<td>C++98</td>
<td>C++20</td>
<td><span class="citation" data-cites="P0966R1">[<a href="#ref-P0966R1" role="doc-biblioref">P0966R1</a>]</span></td>
<td>Remove: <span class="citation" data-cites="P2870R0">[<a href="#ref-P2870R0" role="doc-biblioref">P2870R0</a>]</span></td>
<td>LEWGI</td>
</tr>
<tr class="odd">
<td><a href="#D.26">D.26</a></td>
<td><code class="sourceCode default">&lt;codecvt&gt;</code></td>
<td>C++11</td>
<td>C++17</td>
<td><span class="citation" data-cites="P0618R0">[<a href="#ref-P0618R0" role="doc-biblioref">P0618R0</a>]</span></td>
<td>Remove: <span class="citation" data-cites="P2871R0">[<a href="#ref-P2871R0" role="doc-biblioref">P2871R0</a>]</span></td>
<td>SG16</td>
</tr>
<tr class="even">
<td><a href="#D.27">D.27</a></td>
<td><code class="sourceCode default">wstring_convert</code> et al.</td>
<td>C++11</td>
<td>C++17</td>
<td><span class="citation" data-cites="P0618R0">[<a href="#ref-P0618R0" role="doc-biblioref">P0618R0</a>]</span></td>
<td>Remove: <span class="citation" data-cites="P2872R0">[<a href="#ref-P2872R0" role="doc-biblioref">P2872R0</a>]</span></td>
<td>LEWGI</td>
</tr>
<tr class="odd">
<td><a href="#D.28">D.28</a></td>
<td>Deprecated locale category facets</td>
<td>C++11</td>
<td>C++20</td>
<td><span class="citation" data-cites="P0482R6">[<a href="#ref-P0482R6" role="doc-biblioref">P0482R6</a>]</span></td>
<td>Remove: <span class="citation" data-cites="P2873R0">[<a href="#ref-P2873R0" role="doc-biblioref">P2873R0</a>]</span></td>
<td>SG16</td>
</tr>
<tr class="even">
<td><a href="#D.29">D.29</a></td>
<td><code class="sourceCode default">filesystem::u8path</code></td>
<td>C++17</td>
<td>C++20</td>
<td><span class="citation" data-cites="P0482R6">[<a href="#ref-P0482R6" role="doc-biblioref">P0482R6</a>]</span></td>
<td>No action</td>
<td>SG16</td>
</tr>
<tr class="odd">
<td><a href="#D.30">D.30</a></td>
<td>atomic operations</td>
<td>C++11</td>
<td>C++20</td>
<td><span class="citation" data-cites="P0883R2">[<a href="#ref-P0883R2" role="doc-biblioref">P0883R2</a>]</span></td>
<td>Address by <span class="citation" data-cites="P2866R0">[<a href="#ref-P2866R0" role="doc-biblioref">P2866R0</a>]</span></td>
<td>SG1</td>
</tr>
</tbody>
</table>
<h1 data-number="6" id="reviews"><span class="header-section-number">6</span> Review By Clause<a href="#reviews" class="self-link"></a></h1>
<h2 data-number="6.1" id="D.1"><span class="header-section-number">6.1</span> General [depr.general]<a href="#D.1" class="self-link"></a></h2>
<p>There is no normative content in the general clause, so nothing to
do. We mention it here only so that the automatic subtitle numbering
stays in sync with Annex D of <span class="citation" data-cites="N4944">[<a href="#ref-N4944" role="doc-biblioref">N4944</a>]</span>.</p>
<h2 data-number="6.2" id="D.2"><span class="header-section-number">6.2</span> Arithmetic conversion on
enumerations [depr.arith.conv.enum]<a href="#D.2" class="self-link"></a></h2>
<p>Implicit arithmetic conversion on unscoped enumerations when involved
in mixed operations with another type are part of our C heritage, but
were deprecated to match up with the design of the spaceship operator
for C++20 by paper <span class="citation" data-cites="P1120R0">[<a href="#ref-P1120R0" role="doc-biblioref">P1120R0</a>]</span>.</p>
<p>A full rationale for why we should act to remove these deprecated
conversions now, along with full core wording, is addressed by paper
<span class="citation" data-cites="P2864R0">[<a href="#ref-P2864R0" role="doc-biblioref">P2864R0</a>]</span>.</p>
<h2 data-number="6.3" id="D.3"><span class="header-section-number">6.3</span> Implicit capture of
<code class="sourceCode default">*this</code> by reference
[depr.capture.this]<a href="#D.3" class="self-link"></a></h2>
<p>This feature was deprecated in C++20 by <span class="citation" data-cites="P0806R2">[<a href="#ref-P0806R2" role="doc-biblioref">P0806R2</a>]</span>. Its removal would potentially
impact on programs written against C++11 or a later standard, when
lambda captures were first introduced.</p>
<p>The concern addressed by the paper is that the implicit capture of
<code class="sourceCode default">this</code> as a reference to data
members on a default-capture that copies is surprising and often
misleading. C++20 introduced the explicit capture of
<code class="sourceCode default">this</code> as a pointer, or
<code class="sourceCode default">*this</code> by value, to clearly
disambiguate the different use cases.</p>
<p>MSVC, gcc, and EDG front ends have been warning about this
deprecation since their experimental C++20 support, before the standard
itself was ratified. As of the publication of this paper, the Clang
compiler still does not warn on use of this feature, although a patch to
add that warning is checked into the compiler trunk for what should
become Clang 17.0.</p>
<p>Experience over the last few years has been mixed, as several
compilers would warn on the preferred syntax as redundant
<em>before</em> C++20, so it becomes difficult to get a warning free
build with a single syntax, and is typically achieved by users proving a
macro to choose the preferred form.</p>
<p>The lack of warning in Clang suggests the may be many users of modern
C++ that are still unaware of this deprecation, so the tentative
recommendation is to take no action in C++26, and reconsider more
carefully for C++29. However, the mixed experience of having users
decide which warning they prefer suggests we might want to take more
decisive action for this review, which would require a follow-up paper
to consider the merits of removal vs. undeprecation.</p>
<h2 data-number="6.4" id="D.4"><span class="header-section-number">6.4</span> Array comparisons
[depr.array.comp]<a href="#D.4" class="self-link"></a></h2>
<p>Implicit array-to-pointer decay when invoking any of the comparison
operators is part of our C heritage, but these conversions were
deprecated to match up with the design of the spaceship operator for
C++20 by paper <span class="citation" data-cites="P1120R0">[<a href="#ref-P1120R0" role="doc-biblioref">P1120R0</a>]</span>.</p>
<p>The implicit decay in these cases is often misleading and rarely
helpful. A full rationale for why we should act to remove these
deprecated conversions now, along with full core wording, is addressed
by paper <span class="citation" data-cites="P2864R0">[<a href="#ref-P2864R0" role="doc-biblioref">P2864R0</a>]</span>.</p>
<h2 data-number="6.5" id="D.5"><span class="header-section-number">6.5</span> Deprecated
<code class="sourceCode default">volatile</code> types
[depr.volatile.type]<a href="#D.5" class="self-link"></a></h2>
<p>The <code class="sourceCode default">volatile</code> keyword is part
of our C heritage, but a variety of usages were deprecated for C++20, in
conjunction with our C liaison, by paper <span class="citation" data-cites="P1152R4">[<a href="#ref-P1152R4" role="doc-biblioref">P1152R4</a>]</span>.</p>
<p>As the C committee looked to adopt our deprecations, they got
feedback from their vendors that they considered some of the deprecated
uses as essential, so a subset of this functionality was undeprecated
for C++23 by <span class="citation" data-cites="P2327R1">[<a href="#ref-P2327R1" role="doc-biblioref">P2327R1</a>]</span>.</p>
<p>The remaining set of deprecated operations remain an often misleading
source of bugs, so paper <span class="citation" data-cites="P2866R0">[<a href="#ref-P2866R0" role="doc-biblioref">P2866R0</a>]</span> provides
further rationale for why we should act to remove these deprecated
conversions now, along with full core and library wording.</p>
<h2 data-number="6.6" id="D.6"><span class="header-section-number">6.6</span> Redeclaration of
<code class="sourceCode default">static constexpr</code> data members
[depr.static.constexpr]<a href="#D.6" class="self-link"></a></h2>
<p>Static <code class="sourceCode default">constexpr</code> data members
were added to the language in C++11, as part of the initial
<code class="sourceCode default">constexpr</code> feature. However, they
still required a definition of the member outside the class. When inline
variables were added in C++17 by <span class="citation" data-cites="P0386R2">[<a href="#ref-P0386R2" role="doc-biblioref">P0386R2</a>]</span> then
<code class="sourceCode default">static constexpr</code> data members
became implicitly <code class="sourceCode default">inline</code>, and
the external definition became redundant, so was deprecated. By the time
C++26 is published, such out-of-class definitions will have been
deprecated longer than they were required.</p>
<p>However, as of writing this paper in March 2023, none of the 4 major
compiler front ends report a deprecated use warning on the example in
the standard, including the latest trunk build for open source
compilers. Therefore, the tentative recommendation of this paper is for
no action in the standard towards removing this feature, and encourage
the front ends to start reporting deprecated usage to their users. We
might consider undeprecation given the lack of enthusiasm of vendors to
warn on redundant definitions, although that would feel like a step
backwards, maintaining an exception to the One Definition Rule.</p>
<p>When considering the removal of redundant definitions, it seems
simple enough to support a code base that is common with C++11 and the
feature removal (or warned deprecation) with a simple feature check:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="pp">#if !defined(__cpp_inline_variables)</span></span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> Type Class<span class="op">::</span>Member;</span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a><span class="pp">#endif</span></span></code></pre></div>
<h2 data-number="6.7" id="D.7"><span class="header-section-number">6.7</span> Non-local use of TU-local
entities [depr.local]<a href="#D.7" class="self-link"></a></h2>
<p>This feature was deprecated for C++20 as part of the effort to
cleanly introduce modules into the language, and was adopted by paper
<span class="citation" data-cites="P1815R2">[<a href="#ref-P1815R2" role="doc-biblioref">P1815R2</a>]</span>. It potentially impacts on code
written against C++98 and later standards.</p>
<p>This feature was deprecated only at the final meeting of the C++20
development cycle, and at the time this paper is written, deployment
experience with standard modules is still limited, and it is not clear
if we have any insight into how much code has been impacted by this
deprecation. No current compilers issue a deprecation warning on
affected code. As such, the tentative recommendation is too take no
action — there is not even sufficient experience to consider
undeprecation.</p>
<h2 data-number="6.8" id="D.8"><span class="header-section-number">6.8</span> Implicit declaration of copy
functions [depr.impldec]<a href="#D.8" class="self-link"></a></h2>
<p>This feature was deprecated for C++11 by paper <span class="citation" data-cites="N3203">[<a href="#ref-N3203" role="doc-biblioref">N3203</a>]</span> as part of integrating a good
user experience defining classes now that rvalue references are part of
the language. The deprecated parts address the default behavior of C++03
code.</p>
<p>The following test program will demonstrate deprecation warnings in
gcc since release 9.1, and Clang since release 10.0. For both compilers,
the command line switch <code class="sourceCode default">-Wextra</code>
is required to enable these deprecation warnings. As of the publication
of this paper in April 2023, the EDG and MSVC front ends do not appear
to support this warning yet.</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="kw">struct</span> A <span class="op">{</span></span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a>    A<span class="op">()</span> <span class="op">=</span> <span class="cf">default</span>;</span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a>    A<span class="op">(</span>A <span class="kw">const</span><span class="op">&amp;){}</span></span>
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a><span class="op">}</span>;</span>
<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a><span class="kw">struct</span> B <span class="op">{</span></span>
<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a>    B<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">=(</span>B <span class="kw">const</span><span class="op">&amp;){</span> <span class="cf">return</span> <span class="op">*</span><span class="kw">this</span>; <span class="op">}</span></span>
<span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span>;</span>
<span id="cb2-9"><a href="#cb2-9" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-10"><a href="#cb2-10" aria-hidden="true" tabindex="-1"></a><span class="kw">struct</span> C <span class="op">{</span></span>
<span id="cb2-11"><a href="#cb2-11" aria-hidden="true" tabindex="-1"></a>    <span class="op">~</span>C<span class="op">()</span> <span class="op">{}</span></span>
<span id="cb2-12"><a href="#cb2-12" aria-hidden="true" tabindex="-1"></a><span class="op">}</span>;</span>
<span id="cb2-13"><a href="#cb2-13" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-14"><a href="#cb2-14" aria-hidden="true" tabindex="-1"></a><span class="dt">int</span> main<span class="op">()</span> <span class="op">{</span></span>
<span id="cb2-15"><a href="#cb2-15" aria-hidden="true" tabindex="-1"></a>    A a<span class="op">{}</span>;</span>
<span id="cb2-16"><a href="#cb2-16" aria-hidden="true" tabindex="-1"></a>    A ax <span class="op">=</span> a;</span>
<span id="cb2-17"><a href="#cb2-17" aria-hidden="true" tabindex="-1"></a>    a <span class="op">=</span> ax;     <span class="co">// use of deprecated operator</span></span>
<span id="cb2-18"><a href="#cb2-18" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-19"><a href="#cb2-19" aria-hidden="true" tabindex="-1"></a>    B b<span class="op">{}</span>;</span>
<span id="cb2-20"><a href="#cb2-20" aria-hidden="true" tabindex="-1"></a>    B bx <span class="op">=</span> b;   <span class="co">// use of deprecated constructor</span></span>
<span id="cb2-21"><a href="#cb2-21" aria-hidden="true" tabindex="-1"></a>    b <span class="op">=</span> bx;</span>
<span id="cb2-22"><a href="#cb2-22" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-23"><a href="#cb2-23" aria-hidden="true" tabindex="-1"></a>    C c<span class="op">{}</span>;</span>
<span id="cb2-24"><a href="#cb2-24" aria-hidden="true" tabindex="-1"></a>    C cx <span class="op">=</span> c;   <span class="co">// no-one warns on deprecated constructor</span></span>
<span id="cb2-25"><a href="#cb2-25" aria-hidden="true" tabindex="-1"></a>    c <span class="op">=</span> cx;     <span class="co">// no-one warns on deprecated operator</span></span>
<span id="cb2-26"><a href="#cb2-26" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p>Note that no compiler is warning on copy operations in case
<code class="sourceCode default">C</code>, declaring a user provided
destructor.</p>
<p>This topic was last considered by EWG for C++23 at the 2022 Kona
meeting, where core issue <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#2132">2132</a>
looked into undeprecation. The notes on that discussion offer nothing
more than an immediate call for consensus to not deprecate, and close
that issue as NAD.</p>
<p>This is the oldest deprecated Core language facility, the only one
remaining that was deprecated before C++17. When C++26 is published it
will have been deprecated for 16 years so the tentative recommendation
for this paper is to request authors for a paper providing a considered
analysis of removal and undeprecation, in whole or in part, for
C++26.</p>
<h2 data-number="6.9" id="D.9"><span class="header-section-number">6.9</span> Literal operator function
declarations using an identifier [depr.lit]<a href="#D.9" class="self-link"></a></h2>
<p>The use of whitespace between the
<code class="sourceCode default">operator &quot;&quot;</code> and the
following identifier to denote a user-defined literal suffix was
deprecated for C++23 by <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2521">Core
issue 2521</a>. In deprecating this feature at the 2023 Issaquah
meeting, there is a clear intent that this is one step along the way to
actively remove that support:</p>
<p>EWG had consensus on “The form of User Defined Literals that permits
a space between the quotes and the name of the literal should be
deprecated, and eventually removed. Additionally, the UDL name should be
excluded from the restriction in 5.10 [lex.name] in the non-deprecated
form (sans space).”</p>
<p>Given the lateness in the process of this deprecation, no currently
available compiler has a deprecation warning, nor even the trunk builds
of open source compilers. Hence, the tentative recommendation is to take
no action.</p>
<p>However, given the expressed intent to actively remove the support
for that whitespace, we may want to consider how actively we want to
pursue removal, and request a paper to research whether such removal
would be viable in the 3 year release cycle from C++23 to C++26.</p>
<h2 data-number="6.10" id="D.10"><span class="header-section-number">6.10</span>
<code class="sourceCode default">template</code> keyword before
qualified names [depr.template.template]<a href="#D.10" class="self-link"></a></h2>
<p>This feature was deprecated for C++23 by paper <span class="citation" data-cites="P1787R6">[<a href="#ref-P1787R6" role="doc-biblioref">P1787R6</a>]</span>, Declarations and where to find
them. The following code sample is used to test whether compilers have
implemented that paper yet, and whether they diagnose the deprecated
use:</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span> <span class="op">&lt;</span><span class="kw">class</span> T<span class="op">&gt;</span> <span class="kw">struct</span> A <span class="op">{</span></span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a>   <span class="dt">void</span> f<span class="op">(</span><span class="dt">int</span><span class="op">)</span>;</span>
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a>   <span class="kw">template</span> <span class="op">&lt;</span><span class="kw">class</span> U<span class="op">&gt;</span> <span class="dt">void</span> f<span class="op">(</span>U<span class="op">)</span>;</span>
<span id="cb3-4"><a href="#cb3-4" aria-hidden="true" tabindex="-1"></a><span class="op">}</span>;</span>
<span id="cb3-5"><a href="#cb3-5" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-6"><a href="#cb3-6" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span> <span class="op">&lt;</span><span class="kw">class</span> T<span class="op">&gt;</span></span>
<span id="cb3-7"><a href="#cb3-7" aria-hidden="true" tabindex="-1"></a><span class="kw">struct</span> B <span class="op">{</span></span>
<span id="cb3-8"><a href="#cb3-8" aria-hidden="true" tabindex="-1"></a>   <span class="kw">template</span> <span class="op">&lt;</span><span class="kw">class</span> T2<span class="op">&gt;</span> <span class="kw">struct</span> C <span class="op">{</span> <span class="op">}</span>;</span>
<span id="cb3-9"><a href="#cb3-9" aria-hidden="true" tabindex="-1"></a><span class="op">}</span>;</span>
<span id="cb3-10"><a href="#cb3-10" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-11"><a href="#cb3-11" aria-hidden="true" tabindex="-1"></a><span class="co">// deprecated: T::C is assumed to name a class template:</span></span>
<span id="cb3-12"><a href="#cb3-12" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span> <span class="op">&lt;</span> <span class="kw">class</span> T</span>
<span id="cb3-13"><a href="#cb3-13" aria-hidden="true" tabindex="-1"></a>         , <span class="kw">template</span> <span class="op">&lt;</span><span class="kw">class</span> X<span class="op">&gt;</span> <span class="kw">class</span> TT <span class="op">=</span> T<span class="op">::</span><span class="kw">template</span> C</span>
<span id="cb3-14"><a href="#cb3-14" aria-hidden="true" tabindex="-1"></a>         <span class="op">&gt;</span></span>
<span id="cb3-15"><a href="#cb3-15" aria-hidden="true" tabindex="-1"></a><span class="kw">struct</span> D <span class="op">{</span> <span class="op">}</span>;</span>
<span id="cb3-16"><a href="#cb3-16" aria-hidden="true" tabindex="-1"></a>D<span class="op">&lt;</span>B<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;</span> <span class="op">&gt;</span> db;</span>
<span id="cb3-17"><a href="#cb3-17" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-18"><a href="#cb3-18" aria-hidden="true" tabindex="-1"></a><span class="co">// recommended: T::C is assumed to name a class template:</span></span>
<span id="cb3-19"><a href="#cb3-19" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span> <span class="op">&lt;</span> <span class="kw">class</span> T</span>
<span id="cb3-20"><a href="#cb3-20" aria-hidden="true" tabindex="-1"></a>         , <span class="kw">template</span> <span class="op">&lt;</span><span class="kw">class</span> X<span class="op">&gt;</span> <span class="kw">class</span> TT <span class="op">=</span> T<span class="op">::</span>C</span>
<span id="cb3-21"><a href="#cb3-21" aria-hidden="true" tabindex="-1"></a>         <span class="op">&gt;</span></span>
<span id="cb3-22"><a href="#cb3-22" aria-hidden="true" tabindex="-1"></a><span class="kw">struct</span> E <span class="op">{</span> <span class="op">}</span>;</span>
<span id="cb3-23"><a href="#cb3-23" aria-hidden="true" tabindex="-1"></a>E<span class="op">&lt;</span>B<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;</span> <span class="op">&gt;</span> db;</span></code></pre></div>
<p>Testing with the latest compilers available from Godbolt Compiler
Explorer shows that no current compiler has implemented this part of
that paper yet. Without the implementation, not only are there no
deprecation warnings, the recommended code transformation does not
compile.</p>
<p>Given the current lack of implementation, it seems far too early to
consider removing this feature, so the tentative recommendation is to
take no action.</p>
<p>Given the change in C++11 to accept redundant use of the
<code class="sourceCode default">typename</code> keyword in <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#382">Core
issue 382</a> we might consider undeprecating this feature before
compilers start issuing deprecation warning.</p>
<p>Further, C++11 also allowed redundant use of
<code class="sourceCode default">::template</code> where not required in
non-template cases, <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#468">Core
issue 468</a>, suggesting a level of redundancy is desirable so that
users are not expected to have such a precise mental compiler,
especially when learning the language.</p>
<h2 data-number="6.11" id="requires-paragraph-depr.res.on.required"><span class="header-section-number">6.11</span> Requires paragraph <span id="D.11">depr.res.on.required</span><a href="#requires-paragraph-depr.res.on.required" class="self-link"></a></h2>
<p>This style of documentation was deprecated editorially for C++20
following the application of a sequence of papers to update each main
library clause, consistently following the new conventions established
by paper <span class="citation" data-cites="P0788R3">[<a href="#ref-P0788R3" role="doc-biblioref">P0788R3</a>]</span>. The author
provides a paper with tentative wording to apply the last of those
changes to Annex D, <span class="citation" data-cites="P2874R0">[<a href="#ref-P2874R0" role="doc-biblioref">P2874R0</a>]</span>.</p>
<p>Note that resolving this will touch wording in clauses D.14, D.19,
D.24, D.27, and D.29. We do not track these changes in the paper index
above, as they have no impact on whether deprecated library facilities
are removed, although the edits would be helpful should we desire to
undeprecate any of those clauses.</p>
<h2 data-number="6.12" id="D.12"><span class="header-section-number">6.12</span>
<code class="sourceCode default">has_denorm</code> members in
<code class="sourceCode default">numeric_limits</code>
[depr.numeric.limits.has.denorm]<a href="#D.12" class="self-link"></a></h2>
<p>This small part of
<code class="sourceCode default">numeric_limits</code> for
floating-point types was deprecated for C++23 by paper <span class="citation" data-cites="P2614R2">[<a href="#ref-P2614R2" role="doc-biblioref">P2614R2</a>]</span>.</p>
<p>As a relatively late change to the Standard Library, we have little
experience in how widely triggered the deprecation warning will be, so
the tentative recommendation of this paper is to take no action.</p>
<p>However, it is worth noting that the Zombie Names policy means that
even if we were to remove this feature from the standard tomorrow,
vendors can continue to maintain this feature as a conforming extension
for as long as their customers demand, so with the perceived low risk it
may be worth asking for a paper to remove this feature entirely from
C++26.</p>
<h2 data-number="6.13" id="D.13"><span class="header-section-number">6.13</span> Deprecated C macros
[depr.c.macros]<a href="#D.13" class="self-link"></a></h2>
<p>The C Standard Library headers were undeprecated for C++23 by paper
<span class="citation" data-cites="P2340R1">[<a href="#ref-P2340R1" role="doc-biblioref">P2340R1</a>]</span>. Then the C macros that report
that identifiers corresponding to C++ keywords have been defined as
macros in language support headers were again deprecated as “immediate
issues” by paper <span class="citation" data-cites="P2790R0">[<a href="#ref-P2790R0" role="doc-biblioref">P2790R0</a>]</span>, resolving
national body comments.</p>
<p>It was noted during review that these tokens will become true
keywords in C23, so the pending C Standard will be removing these
macros. Hence, they remain deprecated in C++23, and we except to see
them removed by a paper updating the C++26 Standard to use the latest C
Standard Library.</p>
<p>The tentative recommendation of this paper is to take no action as
part of this deprecation review, anticipating the C library update paper
where this change would be one small part of the larger whole.</p>
<h2 data-number="6.14" id="D.14"><span class="header-section-number">6.14</span> Relational operators
[depr.relops]<a href="#D.14" class="self-link"></a></h2>
<p>The <code class="sourceCode default">std::rel_ops</code> namespace
was introduced in the original C++ Standard, so its removal would
potentially impact on code written against C++98 and later standards. It
was deprecated with the introduction of support for the 3-way comparison
“spaceship” operator in C++20, by paper <span class="citation" data-cites="P0768R1">[<a href="#ref-P0768R1" role="doc-biblioref">P0768R1</a>]</span>.</p>
<p>As of publishing this paper, none of the three popular standard
libraries give any deprecation warnings on the sample code in the Tony
tables below.</p>
<!-- Note that the `operator<=>` markup causes an unfortunate line-break in the
     rendered html that needs to be fixed up by hand after generation.  We have
     looked into a variety of workarounds in the markdown, but pandoc just
     narrows the table or spills on the whole line if we rearrange the text -->
<table>
<thead>
<tr class="header">
<th><div style="text-align:center">
<strong>Deprecated</strong>
</div></th>
<th><div style="text-align:center">
<strong>Modern</strong>
</div></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><div>

<div class="sourceCode" id="cb4"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a><span class="pp">#include </span><span class="im">&lt;cassert&gt;</span></span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a><span class="pp">#include </span><span class="im">&lt;utility&gt;</span></span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a><span class="kw">struct</span> Test <span class="op">{</span></span>
<span id="cb4-5"><a href="#cb4-5" aria-hidden="true" tabindex="-1"></a>   <span class="dt">int</span> data <span class="op">=</span> <span class="dv">0</span>;</span>
<span id="cb4-6"><a href="#cb4-6" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-7"><a href="#cb4-7" aria-hidden="true" tabindex="-1"></a><span class="kw">friend</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span>Test a, Test b<span class="op">){</span><span class="cf">return</span> a<span class="op">.</span>data <span class="op">==</span> b<span class="op">.</span>data;<span class="op">}</span></span>
<span id="cb4-8"><a href="#cb4-8" aria-hidden="true" tabindex="-1"></a><span class="kw">friend</span> <span class="dt">bool</span> <span class="kw">operator</span> <span class="op">&lt;(</span>Test a, Test b<span class="op">){</span><span class="cf">return</span> a<span class="op">.</span>data <span class="op">&lt;</span>  b<span class="op">.</span>data;<span class="op">}</span></span>
<span id="cb4-9"><a href="#cb4-9" aria-hidden="true" tabindex="-1"></a><span class="op">}</span>;</span>
<span id="cb4-10"><a href="#cb4-10" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-11"><a href="#cb4-11" aria-hidden="true" tabindex="-1"></a><span class="dt">int</span> main<span class="op">()</span> <span class="op">{</span></span>
<span id="cb4-12"><a href="#cb4-12" aria-hidden="true" tabindex="-1"></a>    Test x<span class="op">{}</span>;</span>
<span id="cb4-13"><a href="#cb4-13" aria-hidden="true" tabindex="-1"></a>    Test y<span class="op">{</span><span class="dv">2</span><span class="op">}</span>;</span>
<span id="cb4-14"><a href="#cb4-14" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-15"><a href="#cb4-15" aria-hidden="true" tabindex="-1"></a>    <span class="kw">using</span> <span class="kw">namespace</span> std<span class="op">::</span>rel_ops;</span>
<span id="cb4-16"><a href="#cb4-16" aria-hidden="true" tabindex="-1"></a>    <span class="ot">assert</span><span class="op">(</span>x <span class="op">==</span> x<span class="op">)</span>;</span>
<span id="cb4-17"><a href="#cb4-17" aria-hidden="true" tabindex="-1"></a>    <span class="ot">assert</span><span class="op">(</span>x <span class="op">!=</span> y<span class="op">)</span>;</span>
<span id="cb4-18"><a href="#cb4-18" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-19"><a href="#cb4-19" aria-hidden="true" tabindex="-1"></a>    <span class="ot">assert</span><span class="op">(</span>x <span class="op">&lt;</span>  y<span class="op">)</span>;</span>
<span id="cb4-20"><a href="#cb4-20" aria-hidden="true" tabindex="-1"></a>    <span class="ot">assert</span><span class="op">(</span>x <span class="op">&lt;=</span> y<span class="op">)</span>;</span>
<span id="cb4-21"><a href="#cb4-21" aria-hidden="true" tabindex="-1"></a>    <span class="ot">assert</span><span class="op">(</span>x <span class="op">&gt;=</span> y<span class="op">)</span>;</span>
<span id="cb4-22"><a href="#cb4-22" aria-hidden="true" tabindex="-1"></a>    <span class="ot">assert</span><span class="op">(</span>x <span class="op">&gt;</span>  y<span class="op">)</span>;</span>
<span id="cb4-23"><a href="#cb4-23" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>

</div></td>
<td><div>

<div class="sourceCode" id="cb5"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a><span class="pp">#include </span><span class="im">&lt;cassert&gt;</span></span>
<span id="cb5-2"><a href="#cb5-2" aria-hidden="true" tabindex="-1"></a><span class="pp">#include </span><span class="im">&lt;<span class="add" style="color: #006e28"><ins>compare</ins></span>&gt;</span></span>
<span id="cb5-3"><a href="#cb5-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb5-4"><a href="#cb5-4" aria-hidden="true" tabindex="-1"></a><span class="kw">struct</span> Test <span class="op">{</span></span>
<span id="cb5-5"><a href="#cb5-5" aria-hidden="true" tabindex="-1"></a>   <span class="dt">int</span> data <span class="op">=</span> <span class="dv">0</span>;</span>
<span id="cb5-6"><a href="#cb5-6" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb5-7"><a href="#cb5-7" aria-hidden="true" tabindex="-1"></a><span class="kw">friend</span> <span class="dt">bool</span> <span class="kw">operator</span> <span class="op">==(</span>Test, Test<span class="op">)</span> <span class="add" style="color: #006e28"><ins>= default;</ins></span></span>
<span id="cb5-8"><a href="#cb5-8" aria-hidden="true" tabindex="-1"></a><span class="kw">friend</span> <span class="add" style="color: #006e28"><ins>auto
operator&lt;=&gt;</ins></span><span class="op">(</span>Test, Test<span class="op">)</span> <span class="add" style="color: #006e28"><ins>= default;</ins></span></span>
<span id="cb5-9"><a href="#cb5-9" aria-hidden="true" tabindex="-1"></a><span class="op">}</span>;</span>
<span id="cb5-10"><a href="#cb5-10" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb5-11"><a href="#cb5-11" aria-hidden="true" tabindex="-1"></a><span class="dt">int</span> main<span class="op">()</span> <span class="op">{</span></span>
<span id="cb5-12"><a href="#cb5-12" aria-hidden="true" tabindex="-1"></a>    Test x<span class="op">{}</span>;</span>
<span id="cb5-13"><a href="#cb5-13" aria-hidden="true" tabindex="-1"></a>    Test y<span class="op">{</span><span class="dv">2</span><span class="op">}</span>;</span>
<span id="cb5-14"><a href="#cb5-14" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb5-15"><a href="#cb5-15" aria-hidden="true" tabindex="-1"></a>    <span class="rm" style="color: #bf0303"><del><em>// No <span><code class="sourceCode default">using namespace</code></span></em></del></span></span>
<span id="cb5-16"><a href="#cb5-16" aria-hidden="true" tabindex="-1"></a>    <span class="ot">assert</span><span class="op">(</span>x <span class="op">==</span> x<span class="op">)</span>;</span>
<span id="cb5-17"><a href="#cb5-17" aria-hidden="true" tabindex="-1"></a>    <span class="ot">assert</span><span class="op">(</span>x <span class="op">!=</span> y<span class="op">)</span>;</span>
<span id="cb5-18"><a href="#cb5-18" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb5-19"><a href="#cb5-19" aria-hidden="true" tabindex="-1"></a>    <span class="ot">assert</span><span class="op">(</span>x <span class="op">&lt;</span>  y<span class="op">)</span>;</span>
<span id="cb5-20"><a href="#cb5-20" aria-hidden="true" tabindex="-1"></a>    <span class="ot">assert</span><span class="op">(</span>x <span class="op">&lt;=</span> y<span class="op">)</span>;</span>
<span id="cb5-21"><a href="#cb5-21" aria-hidden="true" tabindex="-1"></a>    <span class="ot">assert</span><span class="op">(</span>x <span class="op">&gt;=</span> y<span class="op">)</span>;</span>
<span id="cb5-22"><a href="#cb5-22" aria-hidden="true" tabindex="-1"></a>    <span class="ot">assert</span><span class="op">(</span>x <span class="op">&gt;</span>  y<span class="op">)</span>;</span>
<span id="cb5-23"><a href="#cb5-23" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>

</div></td>
</tr>
</tbody>
</table>
<p>The 2023 version of this paper erroneously claimed that all the
comparisons would be synthesized from the same two operations relied
upon by the <code class="sourceCode default">rel_ops</code> operators.
In fact, those rules rely upon supplying the 3-way comparison operator,
rather than <code class="sourceCode default">operator&lt;</code>, as
illustrated above.</p>
<p>Note the three changes:</p>
<ul>
<li><code class="sourceCode default">#include</code> a different
header</li>
<li>provide a different operator
<ul>
<li>note that definitions can be defaulted now</li>
</ul></li>
<li>do not rely on a using directive</li>
</ul>
<p>Given the current lack of deprecation warnings, the tentative
recommendation of this paper is to take no action for C++26 and
encourage Standard Library maintainers to annotate their implementations
as deprecated before the next standard cycle.</p>
<p>As the
<code class="sourceCode default">using namespace std::rel_ops</code>
idiom may be seen as encouraging bad hygiene, especially when applied at
global/namespace scope in a header, there may still be folks motivated
to write a paper expressing a stronger intent to remove this feature for
C++26.</p>
<p>As a historical note, the Standard Library specification itself used
to rely on <code class="sourceCode default">std::rel_ops</code> to
provide the specification for any comparison operator if the necessary
wording were missing. However, as part of C++20, it was confirmed that
no current wording relies on that legacy fall-back, and the
corresponding as-if wording was removed.</p>
<h2 data-number="6.15" id="D.15"><span class="header-section-number">6.15</span>
<code class="sourceCode default">char *</code> streams
[depr.str.strstreams]<a href="#D.15" class="self-link"></a></h2>
<p>The <code class="sourceCode default">char*</code> streams were
provided, pre-deprecated, in C++98 and have been considered for removal
before. All the necessary facilities to migrate to safer and easier to
use streaming facilities were added in C++20 and C++23, so the
recommendation is to remove the deprecated
<code class="sourceCode default">char *</code> streams from C++26 by
<span class="citation" data-cites="P2867R0">[<a href="#ref-P2867R0" role="doc-biblioref">P2867R0</a>]</span>.</p>
<h2 data-number="6.16" id="D.16"><span class="header-section-number">6.16</span> Deprecated error numbers
[depr.cerrno]<a href="#D.16" class="self-link"></a></h2>
<p>Several macros and enumerators for
<code class="sourceCode default">enum class errc</code> were deprecated
for C++23 by <span class="citation" data-cites="P2790R0">[<a href="#ref-P2790R0" role="doc-biblioref">P2790R0</a>]</span>. While
there is no apparent urgency for their removal given how recently they
were deprecated, the zombie names clause would also give vendors
adequate coverage to retain support at their discretion. This proposal
weakly recommends retaining these names until C++29.</p>
<h2 data-number="6.17" id="D.17"><span class="header-section-number">6.17</span> The default allocator
[depr.default.allocator]<a href="#D.17" class="self-link"></a></h2>
<p>The Standard Library
<code class="sourceCode default">allocator</code> class has a member
that can be synthesized from the primary
<code class="sourceCode default">allocator_traits</code> template, and
was deprecated by [#LWG3170]. By providing this member directly, any
classes that derive from
<code class="sourceCode default">std::allocator</code> will not
synthesize this value correctly, but use the
<code class="sourceCode default">true_type</code> value provided
directly by <code class="sourceCode default">std::allocator</code>,
forcing such allocators to provide their own override when that value
could otherwise by synthesized correctly.</p>
<p>While this is a small corner for misuse, the concern is embarrassing
to explain, and the Standard Library allocator is a common example folks
will follow when trying to write their first allocators. Hence, this
paper recommends the removal of this deprecated typedef for C++26 by
<span class="citation" data-cites="P2868R0">[<a href="#ref-P2868R0" role="doc-biblioref">P2868R0</a>]</span>.</p>
<h2 data-number="6.18" id="D.18"><span class="header-section-number">6.18</span> Deprecated
<code class="sourceCode default">polymorphic_allocator</code> member
function [depr.mem.poly.allocator.mem]<a href="#D.18" class="self-link"></a></h2>
<p>This feature was deprecated by [#LWG3036]. However, the author of
this paper believes that
<code class="sourceCode default">std::pmr::polymorphic_allocator</code>
is an allocator that will be used in non-generic circumstances, unlike
<code class="sourceCode default">std::allocator</code>, so this member
function that could otherwise be synthesized should still be part of its
pubic interface. Hence, the recommendation is to undeprecate with paper
<span class="citation" data-cites="P2875R0">[<a href="#ref-P2875R0" role="doc-biblioref">P2875R0</a>]</span></p>
<h2 data-number="6.19" id="D.19"><span class="header-section-number">6.19</span> Deprecated type traits
[depr.meta.types]<a href="#D.19" class="self-link"></a></h2>
<p>The <code class="sourceCode default">is_pod</code> trait was
deprecated for C++20 by paper <span class="citation" data-cites="P0767R1">[<a href="#ref-P0767R1" role="doc-biblioref">P0767R1</a>]</span> as part of removing the POD
vocabulary from the C++ Standard, both core and library. The term had
changed meaning so frequently that it no longer served as useful
vocabulary. The type trait was extracted to Annex D, and now itself
provides the only definition in the standard for a POD. Client code is
encouraged to use the more specific traits for trivial and standard
layout types to better describe their need. Note that the related term
POF, for Plain Old Function, was removed from C++17 by paper <span class="citation" data-cites="P0270R3">[<a href="#ref-P0270R3" role="doc-biblioref">P0270R3</a>]</span>.</p>
<p>The <code class="sourceCode default">is_pod</code> trait was first
supplied as part of C++11, so its removal would potentially impact
programs written against the C++11 Standard or later. Users have had up
to three years of implementations warning on use of the deprecated
trait, so we could consider removal, with the usual proviso that the
name is preserved as a zombie for previous standardization. As the case
for removal is not urgent, this paper recommends the removal of this
trait from the C++26 Standard, but only weakly. However, the current
wording does not follow library best practices, and should be updated to
better specify the Requires clauses with our modern vocabulary if it is
retained.</p>
<p>The type traits
<code class="sourceCode default">aligned_storage</code> and
<code class="sourceCode default">aligned_union</code> were deprecated
for C++23 by <span class="citation" data-cites="P1413R3">[<a href="#ref-P1413R3" role="doc-biblioref">P1413R3</a>]</span>. They do
use modern library wording, and as they do no active harm the
recommendation is to retain them for C++26 to allow proper time for
users to update their code, and consider again for removal in C++29.</p>
<h3 data-number="6.19.1" id="deployment"><span class="header-section-number">6.19.1</span> Deployment<a href="#deployment" class="self-link"></a></h3>
<p>Tested the following program to observe deprecation warnings for
the<code class="sourceCode default"></code>is_pod` trait through a
variety of standard library implentations at Godbolt Compiler
Explorer:</p>
<div class="sourceCode" id="cb6"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a><span class="pp">#include </span><span class="im">&lt;type_traits&gt;</span></span>
<span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb6-3"><a href="#cb6-3" aria-hidden="true" tabindex="-1"></a><span class="dt">int</span> main<span class="op">()</span> <span class="op">{</span></span>
<span id="cb6-4"><a href="#cb6-4" aria-hidden="true" tabindex="-1"></a>   <span class="kw">static_assert</span><span class="op">(</span>std<span class="op">::</span>is_pod<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;::</span>value, <span class="st">&quot;oops&quot;</span><span class="op">)</span>;</span>
<span id="cb6-5"><a href="#cb6-5" aria-hidden="true" tabindex="-1"></a>   <span class="kw">static_assert</span><span class="op">(</span>std<span class="op">::</span>is_pod_v<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;</span>, <span class="st">&quot;oops&quot;</span><span class="op">)</span>;</span>
<span id="cb6-6"><a href="#cb6-6" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<ul>
<li>libc++ No deprecation warning</li>
<li>libstdc++ gcc 10.1</li>
<li>Microsoft No deprecation warning</li>
</ul>
<h2 data-number="6.20" id="D.20"><span class="header-section-number">6.20</span> Tuple [depr.tuple]<a href="#D.20" class="self-link"></a></h2>
<!-- OLD RATIONALE

Remove with `volatile` work

This feature was deprecated as part of the effort to clean up the use and
semantics of volatile in the language, and was adopted by paper [@P1831R1].  It
potentially impacts on code written against C++11 and later standards.

This feature was deprecated only at the final meeting of the C++20 development
cycle, and at the time this paper is written, there is no experience with how
much code has been impacted by this deprecation.  As such, it is too early to
make any recommendation for a change with respect to this feature.

It is further noted that there is a coupling between the deprecated tuple
traits API, and the deprecated support for volatile structured bindings (D.5).
First, note that volatile tuple itself does not support structured bindings
(nor do any pair and array) as there are no overloads for the get function
taking references to volatile qualified objects.  However, it is still possible
for a user to customize their own type to support such get calls.  If we remove
the volatile support from the tuple traits by default, then the user would have
to provide their own specializations for `tuple_size<volatile TYPE>` and
`tuple_element<volatile TYPE>`, and similarly for the const volatile qualifier.
Alternatively, we could ensure we remove the deprecated support for volatile
structured bindings at the same time that we remove the tuple traits volatile
API.
  -->
<p>This library was deprecated as part of the work on deprecating
unnecessary volatile facilities, so its removal is recommended by paper
<span class="citation" data-cites="P2866R0">[<a href="#ref-P2866R0" role="doc-biblioref">P2866R0</a>]</span>.</p>
<h2 data-number="6.21" id="D.21"><span class="header-section-number">6.21</span> Variant [depr.variant]<a href="#D.21" class="self-link"></a></h2>
<!-- OLD RATIONALE

This feature was deprecated as part of the effort to clean up the use and
semantics of volatile in the language, and was adopted by paper [@P1831R1].  It
potentially impacts on code written against C++17 and later standards.

This feature was deprecated only at the final meeting of the C++20 development
cycle, and at the time this paper is written, there is no experience with how
much code has been impacted by this deprecation.  However, variant has been in
the language for a much shorter time than the similarly impacted tuple, and so
it is likely that much less code would be impacted by its removal. Secondly, as
variant has no volatile qualified member functions, nor external accessors like
get accepting volatile variants, the scope for reasonable use of a volatile
variant is vanishingly small.  Therefore, the strong recommendation of this
paper is to remove directly from C++23, and the weak recommendation is to hold
it over for one more standard cycle, allowing more time for any vestigial usage
to be reworked.

  -->
<p>This library was deprecated as part of the work on deprecating
unnecessary volatile facilities, so its removal is recommended by paper
<span class="citation" data-cites="P2866R0">[<a href="#ref-P2866R0" role="doc-biblioref">P2866R0</a>]</span>.</p>
<h2 data-number="6.22" id="D.22"><span class="header-section-number">6.22</span> Deprecated
<code class="sourceCode default">iterator</code> class template
[depr.iterator]<a href="#D.22" class="self-link"></a></h2>
<p>The class template <code class="sourceCode default">iterator</code>
was first deprecated in C++17 by the paper <span class="citation" data-cites="P0174R2">[<a href="#ref-P0174R2" role="doc-biblioref">P0174R2</a>]</span>. The concern was that providing
the needed support for iterator typenames through a templated base
class, determining which name maps to which type purely by parameter
order, was less clear than simply providing the needed names. Further,
there were corner cases in usage that fell out of template syntax that
made this tool hard to recommend as a simpler way of providing the type
names, yet that was its whole reason to exist.</p>
<p>When this facility was reviewed for removal in C++20, it was noted
that there were valid uses that relied on the default template arguments
to deduce at least a few of the needed type names. Subsequent work on
iterators and ranges (<span class="citation" data-cites="P0896R4">[<a href="#ref-P0896R4" role="doc-biblioref">P0896R4</a>]</span>) that
landed in C++20 now means that work is also done by the primary
<code class="sourceCode default">iterator_traits</code> template, and so
the remaining use case (for new code) is also covered, making this class
template strictly redundant.</p>
<p>The main concern that remains is breaking old code by removing this
code from the standard libraries. That risk is ameliorated by the zombie
names clause in the standard, allowing vendors to maintain their own
support for as long as their customers demand. By the time C++23 ships,
those customers will already have been on 6 years notice that their code
might not be supported in future standards. However, we note the
repeated use of the name
<code class="sourceCode default">iterator</code> as a type within many
containers means we might choose to leave this name off the zombie list.
We conservatively place it there anyway, to ensure that we are covered
by the previous standardization terminology to encompass uses other than
as a container iterator typedef.</p>
<p>The recommendation of this paper is to take no action in C++26 until
the is a stronger consensus for removal.</p>
<h3 data-number="6.22.1" id="initial-review-telecon-20200713"><span class="header-section-number">6.22.1</span> Initial Review: telecon
2020/07/13<a href="#initial-review-telecon-20200713" class="self-link"></a></h3>
<p>Concerns were raised about the lack of research into how much code is
likely to break with the removal of this API. We would like to see more
numbers and analysis on publicly available code, such as across all of
Github. The better treatment of implicit generation of
<code class="sourceCode default">iterator_traits</code> in C++23, and
more familiarity with a limited number of code bases that still rely on
this facility, gave more confidence in moving forward with removal than
we had for C++20. It was also noted that the name may be unfortunate
with the chosen form of concept naming adopted for C++20, and so its
removal might lead to one fewer sources of future confusion. Given that
implementers are likely to provide an implementation (through zombie
names freedom) for some time after removal, there was consensus to
proceed with removal, assuming the requested research does not reveal
major concerns before the main LEWG review to follow.</p>
<h2 data-number="6.23" id="D.23"><span class="header-section-number">6.23</span> Deprecated
<code class="sourceCode default">move_iterator</code> access
[depr.move.iter.elem]<a href="#D.23" class="self-link"></a></h2>
<p>This feature was deprecated for C++20 by the paper <span class="citation" data-cites="P1252R2">[<a href="#ref-P1252R2" role="doc-biblioref">P1252R2</a>]</span> highlighting the concern that
for a move iterator adapter, intending to expose its target as an rvalue
(or xvalue), the arrow operator must return the original adapted
iterator, which will likely produce an lvalue when dereferenced. This
operator is not fit for purpose, and cannot be fixed. The workaround for
users is to dereference the move iterator with
<code class="sourceCode default">operator *</code> and call the member
they wish to access using the familiar
<code class="sourceCode default">.</code> notation. This preserves the
value category of the iterator’s target.</p>
<p>The proposal for C++20 was to deprecate this operator, with a view to
removal at a later date. However,
<code class="sourceCode default">operator-&gt;</code> support is part of
the <em>Cpp17InputIterator</em> requirements, so cannot be removed
without addressing that definition. One option might be to accept the
<code class="sourceCode default">std::move_iterator</code> is
<em>not</em> a <em>Cpp17InputIterator</em> at all, but models the
<code class="sourceCode default">input_iterator</code> concept instead.
That might mean deprecating the
<code class="sourceCode default">iterator_category</code> typedef member
as well.</p>
<p>Testing the following program with Godbolt Compiler Explorer, it
appears that libc++ is the only Standard Library implementation, at the
time of writing this paper, that warns on use of the deprecated
operator, and has done so only since Clang 15:</p>
<div class="sourceCode" id="cb7"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a><span class="pp">#include </span><span class="im">&lt;iterator&gt;</span></span>
<span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-3"><a href="#cb7-3" aria-hidden="true" tabindex="-1"></a><span class="kw">struct</span> Wrap <span class="op">{</span></span>
<span id="cb7-4"><a href="#cb7-4" aria-hidden="true" tabindex="-1"></a>    <span class="dt">int</span> data;</span>
<span id="cb7-5"><a href="#cb7-5" aria-hidden="true" tabindex="-1"></a><span class="op">}</span>;</span>
<span id="cb7-6"><a href="#cb7-6" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-7"><a href="#cb7-7" aria-hidden="true" tabindex="-1"></a><span class="dt">int</span> main<span class="op">()</span> <span class="op">{</span></span>
<span id="cb7-8"><a href="#cb7-8" aria-hidden="true" tabindex="-1"></a>   Wrap x <span class="op">=</span> <span class="op">{</span><span class="dv">42</span><span class="op">}</span>;</span>
<span id="cb7-9"><a href="#cb7-9" aria-hidden="true" tabindex="-1"></a>   std<span class="op">::</span>move_iterator it <span class="op">=</span> std<span class="op">::</span>make_move_iterator<span class="op">(&amp;</span>x<span class="op">)</span>;</span>
<span id="cb7-10"><a href="#cb7-10" aria-hidden="true" tabindex="-1"></a>   <span class="kw">auto</span> y <span class="op">=</span> it<span class="op">-&gt;</span>data;</span>
<span id="cb7-11"><a href="#cb7-11" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p>The recommendation is to take no action at this time, unless a more
detailed paper is requested.</p>
<h2 data-number="6.24" id="D.24"><span class="header-section-number">6.24</span> Deprecated
<code class="sourceCode default">shared_ptr</code> atomic access
[depr.util.smartptr.shared.atomic]<a href="#D.24" class="self-link"></a></h2>
<p>The legacy C-style atomic API for manipulating shared pointers
provided in C++11 is subtle, frequently misunderstood, and easily
misused to cause data races. A type-safe replacement facility that also
provides support for
<code class="sourceCode default">atomic&lt;weak_ptr&lt;T&gt;&gt;</code>
was added to C++20, so we recommend removing the legacy API at the
earliest opportunity.</p>
<p>See paper <span class="citation" data-cites="P2869R0">[<a href="#ref-P2869R0" role="doc-biblioref">P2869R0</a>]</span> for a more
detailed discussion and proposed wording.</p>
<h2 data-number="6.25" id="D.25"><span class="header-section-number">6.25</span> Deprecated
<code class="sourceCode default">basic_string</code> capacity
[depr.string.capacity]<a href="#D.25" class="self-link"></a></h2>
<p>See paper <span class="citation" data-cites="P2870R0">[<a href="#ref-P2870R0" role="doc-biblioref">P2870R0</a>]</span> for a more
detailed discussion and proposed wording to remove this facility from
C++26.</p>
<!--
This feature was first deprecated for C++20 by the paper [@P0966R1].  The
deprecation was a consequence of cleaning up the behavior of the reserve
function to no longer optionally reallocate on a request to shrink.  The
original C++98 specification for `basic_string` supplied a default argument of
0 for reserve, turning a call to `reserve()` into a non-binding `shrink_to_fit`
request.  Note that `shrink_to_fit` was added in C++11 to better support this
use case.  With the removal of the potentially reallocating behavior,
`reserve()` is now a redundant function overload that is guaranteed to do
nothing.  Hence it was deprecated in C++20, with a view to removing it entirely
in a later standard to eliminate on more legacy source of confusion from the
standard.

### C++23 Review: telecon 2020/07/13

General agreement that this member is a holdover from another time, whose
replacement has been in place for some time.  Consensus to remove from C++23,
assuming the subsequent research does not reveal major concerns before the main
LEWG review that is to follow.

### C++26 Recommendation

While the need is not pressing, the sentiment was for removal in the previous
standard, so three years later we make the same (weak) recommendation to
remove from C++26.
  -->
<h2 data-number="6.26" id="D.26"><span class="header-section-number">6.26</span> Deprecated standard code
conversion facets [depr.locale.stdcvt]<a href="#D.26" class="self-link"></a></h2>
<p>This feature was originally proposed for C++11 by paper <span class="citation" data-cites="N2007">[<a href="#ref-N2007" role="doc-biblioref">N2007</a>]</span> and deprecated for C++17 by paper
<span class="citation" data-cites="P0618R0">[<a href="#ref-P0618R0" role="doc-biblioref">P0618R0</a>]</span>. As noted at the time, the
feature was underspecified, a source of security issues handling
malformed Unicode, and would require more work than we wished to invest
to bring it up to standard. Since then SG16 has been convened and is
producing a steady stream of work to bring reliable well-specified
Unicode support to C++.</p>
<p>Given vendors propensity to provide ongoing support for deprecated
libraries under the zombie name reservations, we recommend removal from
C++26, see paper <span class="citation" data-cites="P2871R0">[<a href="#ref-P2871R0" role="doc-biblioref">P2871R0</a>]</span> for
details.</p>
<h2 data-number="6.27" id="D.27"><span class="header-section-number">6.27</span> Deprecated convenience
conversion interfaces [depr.conversions]<a href="#D.27" class="self-link"></a></h2>
<p>See paper <span class="citation" data-cites="P2872R0">[<a href="#ref-P2872R0" role="doc-biblioref">P2872R0</a>]</span> for a more
detailed discussion and proposed wording to remove this facility from
C++26.</p>
<!--
This feature was originally proposed for C++11 by paper [@N2401] and deprecated
for C++17 by paper [@P0618R0]. As noted at the time, the feature was
underspecified and would require more work than we wished to invest to bring it
up to standard.  Since then SG16 has been convened and is producing a steady
stream of work to bring reliable well-specified Unicode support to C++.

Given vendors propensity to provide ongoing support for these names under the
zombie name reservations, the strong recommendation of this paper is to remove
this library immediately from the C++23 Standard.  The weak recommendation is
to do the minimal work to clean up the wording to use the more precise terms
that replaced Requires clauses, waiting until SG16 (or some other entity)
produces a clean replacement for this facility for users to migrate to before
removal.

There are currently 4 open LWG issues relating to this clause; there would be
more, but we would rather see this feature removed than keep adding issues to
deprecated library features.

- [@LWG2478] Unclear how `wstring_convert` uses `cvtstate`
- [@LWG2479] Unclear how `wbuffer_convert` uses `cvtstate`
- [@LWG2480] Error handling of `wbuffer_convert` unclear
- [@LWG2481] `wstring_convert` should be more precise regarding "byte-error string" etc.

### Deployment

At the time of writing this paper, both libc++ and libstdc++ give deprecation
warnings when this overload is used, but the Microsoft library implementation
does not.

### Initial Review for C++23: telecon 2020/07/13

Discussion was broadly in favor of removal from the C++23 specification, and
relying on library vendors to maintain source compatibility as long as needed.
However, LEWGI explicitly requested to confer with SG16 in case that study
group is aware of any reason to hold back on removal, before proceeding with
the recommendation.

### SG16 Review for C++23: telecon 2020/07/22

SG16 raises concerns that the original paper deprecating this feature lacked a
strong motivation, as it was simply recording a recommendation from LWG review
when deprecating the `<codecvt>` header for D.20.  There is general concern
that `codecvt` is not fit for purpose, notably due to poorly specified error
handling capabilities while transcoding, but this deprecation does not address
that, it is merely a convenience API for using that underspecified library
component.  While removing the `<codecvt>` header might mean there would be
fewer standard `codecvt` facets to use with this API, it remains just a as
usable with user provided `codecvt` facets as before, as well as those in the
`<locale>` header. While we would like to see a replacement facility, there is
no such proposal at this time.

Polling showed no consensus to recommend the removal for C++23, but no
objection to that removal either.

### LEWGI Consensus for C++23:

Confirmed SG16 has no objection; remove this feature from C++23

### Recommendation for C++26

Following LEWGI consensus for C++23, recommend the removal of this

Close LWG issues [@LWG2478], [@LWG2479], [@LWG2480],  and [@LWG2481] as
resolved by removal of the feature in pending paper [@P2872R0].

  -->
<h2 data-number="6.28" id="D.28"><span class="header-section-number">6.28</span> Deprecated locale category
facets [depr.locale.category]<a href="#D.28" class="self-link"></a></h2>
<p>See paper <span class="citation" data-cites="P2872R0">[<a href="#ref-P2872R0" role="doc-biblioref">P2872R0</a>]</span> for a more
detailed discussion and proposed wording to remove this facility from
C++26.</p>
<!-- OLD RATIONAL

This feature was added as part of the initial basic support for Unicode types
in C++11 by paper [@N2238] and deprecated on the recommendation of SG16 for
C++20 by paper [@P0482R6].

As SG16 do not report any urgent issue relating to this deprecated feature, and
are still working through the process of providing clean Unicode support in the
C++ Standard Library, and given the deprecation is as recent as C++20, both the
strong and weak recommendations are to take no action on this feature at this
time.

### Initial Review: telecon 2020/07/13

Discussion was broadly in favor of removal from the C++23 specification, and
relying on library vendors to maintain source compatibility as long as needed.
However, LEWGI explicitly requested to confer with SG16 in case that study
group is aware of any reason to hold back on removal, before proceeding with
the recommendation.

### SG16 Review: telecon 2020/07/22

SG16 is concerned that `code_cvt` in general has poor error handling
facilities, especially when dealing with encodings that may take multiple code
units to express a code point, and so have more cause to report on malformed
inputs.  The specific facets in [depr.locale.category]{.sref} stand in the way
of putting a minimally useful replacement into the standard, by sitting on the
good names but with poor semantics.  This means that the usual safety net of
the zombie names clause does not apply, as we will want code to not compile for
at least one release in order to introduce a replacement with the same names
but more appropriate semantics.  Concern was raised about removing a feature
deprecated only as recently as the current C++20 Standard.

Polling showed no consensus to recommend the removal for C++23, but no
objection to that removal either.

### LEWGI Consensus:

Confirmed SG16 has no objection; remove this feature from C++23

  -->
<h2 data-number="6.29" id="D.29"><span class="header-section-number">6.29</span> Deprecated filesystem path
factory functions [depr.fs.path.factory]<a href="#D.29" class="self-link"></a></h2>
<p>See issue <a href="https://cplusplus.github.io/LWG/lwg-active.html#3840">LWG 3840</a>
for most recent feedback. This paper does not recommend taking any
action beyond following the LWG issue process for C++26.</p>
<!-- OLD RATIONALE
Safe to remove?

A factory function to create path names from UTF-8 sequences was part of the
original filesystem library adopted for C++17.  However, this was the only
string-based factory function, as the preferred interface is to simply
construct a path with a string of the corresponding type/encoding.  This
factory function was deprecated in C++20 with the addition of `char8_t` and the
ability to now invoke a specific constructor for UTF-8 encoded (and typed)
strings.  See [@P0482R6] for details.

The legacy API continues to function, but is more cumbersome than necessary.
There appears to be no compelling case that the API is a risk through misuse.
Therefore, given it was so recently deprecated, the strong recommendation is to
retain this feature in Annex D for C++23, giving the community time to catch
up, and consider removal again for C++26.  However, the current wording does
not follow library best practices, and should be updated to better specify the
Requires clauses.

However, while it does no active harm, there is always a cost to maintaining
text in the standard. The application of zombie names means that even if we
remove this clause from Annex D in C++23, Standard Library vendors are likely
to continue shipping to meet customer demand for some time to come.  So the
weak recommendation is to add the names to the zombie clause, and remove
immediately from C++23.

### Initial Review: telecon 2020/07/13

Discussion was broadly in favor of removal from the C++23 specification, and
relying on library vendors to maintain source compatibility as long as needed.
However, LEWGI explicitly requested to confer with SG16 in case that study
group is aware of any reason to hold back on removal, before proceeding with
the recommendation.

### SG16 Review: telecon 2020/07/22

SG16 is not persuaded that this is actually a text issue, as filenames in
practice accept a broader definition of text, and treating them as straight
text is often a source of subtle and surprising problems.  There was mild
concern at the idea of removing something deprecated as recently as C++20, but
it was also noted that the deprecating paper was adopted into the working draft
before at least one major library distribution had provided its initial
implementation!  No objection to the removal, if anything a mild encouragement
to proceed!

### LEWGI Consesnus:

Following check with SG16 for concerns, recommend removal of this feature from
C++23.

-->
<h2 data-number="6.30" id="D.30"><span class="header-section-number">6.30</span> Deprecated atomic operations
[depr.atomics]<a href="#D.30" class="self-link"></a></h2>
<p>While it does no active harm, there is always a cost to maintaining
text in the standard. This is similarly reflected in the C Standard,
that initially deprecated the
<code class="sourceCode default">ATOMIC_VAR_INT</code> macro (marked it
as obsolescent) in C17, and is actively looking to remove it from the
C2X Standard, per the paper WG14:N2390. We should strongly consider
removing this macro, but perhaps as part of a broader paper to update
our reference to the C23 Standard Library.</p>
<p>The original API to initialize atomic variables from C++11 was
deprecated for C++20 when the atomic template was given a default
constructor to do the right thing. See <span class="citation" data-cites="P0883R2">[<a href="#ref-P0883R2" role="doc-biblioref">P0883R2</a>]</span> for details.</p>
<p>The legacy API continues to function, but is more cumbersome than
necessary. There appears to be no compelling case that the API is a risk
through misuse. However, if updating our reference to the C23 library
removes the <code class="sourceCode default">ATOMIC_VAR_INT</code>
macro, we might want to consider this removal for C++26.</p>
<p>Additionally, the volatile qualified member functions of the
<code class="sourceCode default">atomic</code> class template were
deprecated for C++20 by paper <span class="citation" data-cites="P1831R1">[<a href="#ref-P1831R1" role="doc-biblioref">P1831R1</a>]</span>. Their removal should be
considered as part of <span class="citation" data-cites="P2866R0">[<a href="#ref-P2866R0" role="doc-biblioref">P2866R0</a>]</span> proposing
removal of deprecated volatile operations.</p>
<h1 data-number="7" id="ack"><span class="header-section-number">7</span> Acknowledgements<a href="#ack" class="self-link"></a></h1>
<p>Special thanks for Matt Godbolt for Compiler Explorer, that made it
incredibly simple to test deprecated code samples across a variety of
compilers, ancient and modern. This paper would be much less informed
without the rapid testing it enabled.</p>
<p>Thanks to Michael Parks for the pandoc-based framework used to
generate this paper from extended markdown source.</p>
<h1 data-number="8" id="bibliography"><span class="header-section-number">8</span> References<a href="#bibliography" class="self-link"></a></h1>
<div id="refs" class="references csl-bib-body hanging-indent" role="doc-bibliography">
<div id="ref-N2007" class="csl-entry" role="doc-biblioentry">
[N2007] P.J. Plauger. 2006-04-15. Proposed Library Additions for Code
Conversion. <a href="https://wg21.link/n2007"><div class="csl-block">https://wg21.link/n2007</div></a>
</div>
<div id="ref-N3203" class="csl-entry" role="doc-biblioentry">
[N3203] Jens Maurer. 2010-11-11. Tightening the conditions for
generating implicit moves. <a href="https://wg21.link/n3203"><div class="csl-block">https://wg21.link/n3203</div></a>
</div>
<div id="ref-N4944" class="csl-entry" role="doc-biblioentry">
[N4944] Thomas Köppe. 2023-03-22. Working Draft, Standard for
Programming Language C++. <a href="https://wg21.link/n4944"><div class="csl-block">https://wg21.link/n4944</div></a>
</div>
<div id="ref-P0174R2" class="csl-entry" role="doc-biblioentry">
[P0174R2] Alisdair Meredith. 2016-06-23. Deprecating Vestigial Library
Parts in C++17. <a href="https://wg21.link/p0174r2"><div class="csl-block">https://wg21.link/p0174r2</div></a>
</div>
<div id="ref-P0270R3" class="csl-entry" role="doc-biblioentry">
[P0270R3] Hans Boehm. 2017-02-02. Removing C dependencies from signal
handler wording. <a href="https://wg21.link/p0270r3"><div class="csl-block">https://wg21.link/p0270r3</div></a>
</div>
<div id="ref-P0386R2" class="csl-entry" role="doc-biblioentry">
[P0386R2] Hal Finkel, Richard Smith. 2016-06-24. Inline Variables. <a href="https://wg21.link/p0386r2"><div class="csl-block">https://wg21.link/p0386r2</div></a>
</div>
<div id="ref-P0482R6" class="csl-entry" role="doc-biblioentry">
[P0482R6] Tom Honermann. 2018-11-09. char8_t: A type for UTF-8
characters and strings (Revision 6). <a href="https://wg21.link/p0482r6"><div class="csl-block">https://wg21.link/p0482r6</div></a>
</div>
<div id="ref-P0618R0" class="csl-entry" role="doc-biblioentry">
[P0618R0] Alisdair Meredith. 2017-03-02. Deprecating &lt;codecvt&gt;. <a href="https://wg21.link/p0618r0"><div class="csl-block">https://wg21.link/p0618r0</div></a>
</div>
<div id="ref-P0718R2" class="csl-entry" role="doc-biblioentry">
[P0718R2] Alisdair Meredith. 2017-11-10. Revising atomic_shared_ptr for
C++20. <a href="https://wg21.link/p0718r2"><div class="csl-block">https://wg21.link/p0718r2</div></a>
</div>
<div id="ref-P0767R1" class="csl-entry" role="doc-biblioentry">
[P0767R1] Jens Maurer. 2017-11-10. Deprecate POD. <a href="https://wg21.link/p0767r1"><div class="csl-block">https://wg21.link/p0767r1</div></a>
</div>
<div id="ref-P0768R1" class="csl-entry" role="doc-biblioentry">
[P0768R1] Walter E. Brown. 2017-11-10. Library Support for the Spaceship
(Comparison) Operator. <a href="https://wg21.link/p0768r1"><div class="csl-block">https://wg21.link/p0768r1</div></a>
</div>
<div id="ref-P0788R3" class="csl-entry" role="doc-biblioentry">
[P0788R3] Walter E. Brown. 2018-06-07. Standard Library Specification in
a Concepts and Contracts World. <a href="https://wg21.link/p0788r3"><div class="csl-block">https://wg21.link/p0788r3</div></a>
</div>
<div id="ref-P0806R2" class="csl-entry" role="doc-biblioentry">
[P0806R2] Thomas Köppe. 2018-06-04. Deprecate implicit capture of this
via [=]. <a href="https://wg21.link/p0806r2"><div class="csl-block">https://wg21.link/p0806r2</div></a>
</div>
<div id="ref-P0883R2" class="csl-entry" role="doc-biblioentry">
[P0883R2] Nicolai Josuttis. 2019-11-08. Fixing Atomic Initialization. <a href="https://wg21.link/p0883r2"><div class="csl-block">https://wg21.link/p0883r2</div></a>
</div>
<div id="ref-P0896R4" class="csl-entry" role="doc-biblioentry">
[P0896R4] Eric Niebler, Casey Carter, Christopher Di Bella. 2018-11-09.
The One Ranges Proposal. <a href="https://wg21.link/p0896r4"><div class="csl-block">https://wg21.link/p0896r4</div></a>
</div>
<div id="ref-P0966R1" class="csl-entry" role="doc-biblioentry">
[P0966R1] Mark Zeren, Andrew Luo. 2018-02-08. string::reserve Should Not
Shrink. <a href="https://wg21.link/p0966r1"><div class="csl-block">https://wg21.link/p0966r1</div></a>
</div>
<div id="ref-P1120R0" class="csl-entry" role="doc-biblioentry">
[P1120R0] Richard Smith. 2018-06-08. Consistency improvements for
&lt;=&gt; and other comparison operators. <a href="https://wg21.link/p1120r0"><div class="csl-block">https://wg21.link/p1120r0</div></a>
</div>
<div id="ref-P1152R4" class="csl-entry" role="doc-biblioentry">
[P1152R4] JF Bastien. 2019-07-22. Deprecating volatile. <a href="https://wg21.link/p1152r4"><div class="csl-block">https://wg21.link/p1152r4</div></a>
</div>
<div id="ref-P1252R2" class="csl-entry" role="doc-biblioentry">
[P1252R2] Casey Carter. 2019-02-22. Ranges Design Cleanup. <a href="https://wg21.link/p1252r2"><div class="csl-block">https://wg21.link/p1252r2</div></a>
</div>
<div id="ref-P1413R3" class="csl-entry" role="doc-biblioentry">
[P1413R3] CJ Johnson. 2021-11-22. Deprecate std::aligned_storage and
std::aligned_union. <a href="https://wg21.link/p1413r3"><div class="csl-block">https://wg21.link/p1413r3</div></a>
</div>
<div id="ref-P1787R6" class="csl-entry" role="doc-biblioentry">
[P1787R6] S. Davis Herring. 2020-10-28. Declarations and where to find
them. <a href="https://wg21.link/p1787r6"><div class="csl-block">https://wg21.link/p1787r6</div></a>
</div>
<div id="ref-P1815R2" class="csl-entry" role="doc-biblioentry">
[P1815R2] S. Davis Herring. 2020-02-14. Translation-unit-local entities.
<a href="https://wg21.link/p1815r2"><div class="csl-block">https://wg21.link/p1815r2</div></a>
</div>
<div id="ref-P1831R1" class="csl-entry" role="doc-biblioentry">
[P1831R1] JF Bastien. 2020-02-12. deprecating volatile: library. <a href="https://wg21.link/p1831r1"><div class="csl-block">https://wg21.link/p1831r1</div></a>
</div>
<div id="ref-P2327R1" class="csl-entry" role="doc-biblioentry">
[P2327R1] Paul M. Bendixen, Jens Maurer, Arthur O’Dwyer, Ben Saks.
2021-10-04. De-deprecating volatile compound operations. <a href="https://wg21.link/p2327r1"><div class="csl-block">https://wg21.link/p2327r1</div></a>
</div>
<div id="ref-P2340R1" class="csl-entry" role="doc-biblioentry">
[P2340R1] Thomas Köppe. 2021-06-11. Clarifying the status of the
<span>“C headers.”</span> <a href="https://wg21.link/p2340r1"><div class="csl-block">https://wg21.link/p2340r1</div></a>
</div>
<div id="ref-P2614R2" class="csl-entry" role="doc-biblioentry">
[P2614R2] Matthias Kretz. 2022-11-08. Deprecate
numeric_limits::has_denorm. <a href="https://wg21.link/p2614r2"><div class="csl-block">https://wg21.link/p2614r2</div></a>
</div>
<div id="ref-P2790R0" class="csl-entry" role="doc-biblioentry">
[P2790R0] Jonathan Wakely. 2023-02-13. C++ Standard Library Immediate
Issues to be moved in Issaquah, Feb. 2023. <a href="https://wg21.link/p2790r0"><div class="csl-block">https://wg21.link/p2790r0</div></a>
</div>
<div id="ref-P2864R0" class="csl-entry" role="doc-biblioentry">
[P2864R0] Alisdair Meredith. 2023-05-15. Remove Deprecated Arithmetic
Conversion on Enumerations From C++26. <a href="https://wg21.link/p2864r0"><div class="csl-block">https://wg21.link/p2864r0</div></a>
</div>
<div id="ref-P2865R0" class="csl-entry" role="doc-biblioentry">
[P2865R0] Alisdair Meredith. 2023-05-15. Remove Deprecated Array
Comparisons from C++26. <a href="https://wg21.link/p2865r0"><div class="csl-block">https://wg21.link/p2865r0</div></a>
</div>
<div id="ref-P2866R0" class="csl-entry" role="doc-biblioentry">
[P2866R0] Alisdair Meredith. 2023-05-15. Remove Deprecated Volatile
Features From C++26. <a href="https://wg21.link/p2866r0"><div class="csl-block">https://wg21.link/p2866r0</div></a>
</div>
<div id="ref-P2867R0" class="csl-entry" role="doc-biblioentry">
[P2867R0] Alisdair Meredith. 2023-05-15. Remove Deprecated strstreams
From C++26. <a href="https://wg21.link/p2867r0"><div class="csl-block">https://wg21.link/p2867r0</div></a>
</div>
<div id="ref-P2868R0" class="csl-entry" role="doc-biblioentry">
[P2868R0] Alisdair Meredith. 2023-05-15. Remove Deprecated
<code class="sourceCode default">std::allocator</code> Typedef From
C++26. <a href="https://wg21.link/p2868r0"><div class="csl-block">https://wg21.link/p2868r0</div></a>
</div>
<div id="ref-P2869R0" class="csl-entry" role="doc-biblioentry">
[P2869R0] Alisdair Meredith. 2023-05-15. Remove Deprecated
<code class="sourceCode default">shared_ptr</code> Atomic Access APIs
From C++26. <a href="https://wg21.link/p2869r0"><div class="csl-block">https://wg21.link/p2869r0</div></a>
</div>
<div id="ref-P2870R0" class="csl-entry" role="doc-biblioentry">
[P2870R0] Alisdair Meredith. 2023-05-15. Remove
<code class="sourceCode default">basic_string::reserve()</code> From
C++26. <a href="https://wg21.link/p2870r0"><div class="csl-block">https://wg21.link/p2870r0</div></a>
</div>
<div id="ref-P2871R0" class="csl-entry" role="doc-biblioentry">
[P2871R0] Alisdair Meredith. 2023-05-15. Remove Deprecated Unicode
Conversion Facets From C++26. <a href="https://wg21.link/p2871r0"><div class="csl-block">https://wg21.link/p2871r0</div></a>
</div>
<div id="ref-P2872R0" class="csl-entry" role="doc-biblioentry">
[P2872R0] Alisdair Meredith. 2023-05-15. Remove
<code class="sourceCode default">wstring_convert</code> From C++26. <a href="https://wg21.link/p2872r0"><div class="csl-block">https://wg21.link/p2872r0</div></a>
</div>
<div id="ref-P2873R0" class="csl-entry" role="doc-biblioentry">
[P2873R0] Alisdair Meredith. 2023-05-15. Remove Deprecated Locale
Category Facets For Unicode from C++26. <a href="https://wg21.link/p2873r0"><div class="csl-block">https://wg21.link/p2873r0</div></a>
</div>
<div id="ref-P2874R0" class="csl-entry" role="doc-biblioentry">
[P2874R0] Alisdair Meredith. 2023-05-15. Mandating Annex D. <a href="https://wg21.link/p2874r0"><div class="csl-block">https://wg21.link/p2874r0</div></a>
</div>
<div id="ref-P2875R0" class="csl-entry" role="doc-biblioentry">
[P2875R0] Alisdair Meredith. 2023-05-15. Undeprecate
<code class="sourceCode default">polymorphic_allocator::destroy</code>
For C++26. <a href="https://wg21.link/p2875r0"><div class="csl-block">https://wg21.link/p2875r0</div></a>
</div>
</div>
</div>
</div>
</body>
</html>
