<!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-09-15" />
  <title>Remove Deprecated strstreams From 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">Remove Deprecated strstreams
From C++26</h1>
<table style="border:none;float:right">
  <tr>
    <td>Document #:</td>
    <td>P2867R1</td>
  </tr>
  <tr>
    <td>Date:</td>
    <td>2023-09-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>
      Library Evolution Incubator<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="#rev.hist" id="toc-rev.hist"><span class="toc-section-number">2</span> Revision history<span></span></a>
<ul>
<li><a href="#r1-september-2023-midterm-mailing" id="toc-r1-september-2023-midterm-mailing">R1: September 2023 (midterm
mailing)<span></span></a></li>
<li><a href="#r0-varna-2023" id="toc-r0-varna-2023">R0: Varna
2023<span></span></a></li>
</ul></li>
<li><a href="#intro" id="toc-intro"><span class="toc-section-number">3</span> Introduction<span></span></a></li>
<li><a href="#intro.origin" id="toc-intro.origin"><span class="toc-section-number">4</span> Origin<span></span></a></li>
<li><a href="#analysis" id="toc-analysis"><span class="toc-section-number">5</span> Analysis<span></span></a></li>
<li><a href="#prop" id="toc-prop"><span class="toc-section-number">6</span> Proposal<span></span></a></li>
<li><a href="#wording" id="toc-wording"><span class="toc-section-number">7</span> Wording<span></span></a>
<ul>
<li><a href="#strike-strstream-from-the-list-of-standard-headers" id="toc-strike-strstream-from-the-list-of-standard-headers"><span class="toc-section-number">7.1</span> Strike
<code class="sourceCode default">&lt;strstream&gt;</code> from the list
of standard headers<span></span></a></li>
<li><a href="#add-new-identifiers-to-zombie.names." id="toc-add-new-identifiers-to-zombie.names."><span class="toc-section-number">7.2</span> Add new identifiers to
<span>16.4.5.3.2
<span>[zombie.names]</span></span>.<span></span></a></li>
<li><a href="#update-annex-c" id="toc-update-annex-c"><span class="toc-section-number">7.3</span> Update Annex
C:<span></span></a></li>
<li><a href="#strike-all-of-depr.str.strstreams-char-streams" id="toc-strike-all-of-depr.str.strstreams-char-streams"><span class="toc-section-number">7.4</span> Strike all of <span>D.14
<span>[depr.str.strstreams]</span></span>
<code class="sourceCode default">char *</code>
streams<span></span></a></li>
<li><a href="#update-cross-reference-for-stable-labels-for-c23" id="toc-update-cross-reference-for-stable-labels-for-c23"><span class="toc-section-number">7.5</span> Update cross-reference for stable
labels for C++23<span></span></a></li>
<li><a href="#resolve-open-library-issues" id="toc-resolve-open-library-issues"><span class="toc-section-number">7.6</span> Resolve open library
issues<span></span></a></li>
</ul></li>
<li><a href="#ack" id="toc-ack"><span class="toc-section-number">8</span>
Acknowledgements<span></span></a></li>
<li><a href="#bibliography" id="toc-bibliography"><span class="toc-section-number">9</span> References<span></span></a></li>
</ul>
</div>
<!-- RENDER AS html AS TABLES FORMAT BADLY IN THE pdf TOOLCHAIN -->
<h1 data-number="1" id="abstract"><span class="header-section-number">1</span> Abstract<a href="#abstract" class="self-link"></a></h1>
<p>Annex D of the C++ Standard, deprecated features, maintains a limited
and easily misused iostreams facility for
<code class="sourceCode default">char *</code> strings in user-managed
memory. This paper proposes the removing this facility from the C++
Standard Library as C++20 and C++23 have provided superior replacement
facilities.</p>
<h1 data-number="2" id="rev.hist"><span class="header-section-number">2</span> Revision history<a href="#rev.hist" class="self-link"></a></h1>
<h2 class="unnumbered" id="r1-september-2023-midterm-mailing">R1:
September 2023 (midterm mailing)<a href="#r1-september-2023-midterm-mailing" class="self-link"></a></h2>
<ul>
<li>Removed revision history’s redundant subsection numbering</li>
<li>Provided complete wording based on the latest working draft, <span class="citation" data-cites="N4958">[<a href="#ref-N4958" role="doc-biblioref">N4958</a>]</span>
<ul>
<li>Removed the whole of <span>D.14
<a href="https://wg21.link/depr.str.strstreams">[depr.str.strstreams]</a></span></li>
<li>Removed <code class="sourceCode default">&lt;strstream&gt;</code>
from the table of all standard headers</li>
<li>Added necessary additional names to <span>16.4.5.3.2
<a href="https://wg21.link/zombie.names">[zombie.names]</a></span></li>
<li>Supplied Annex C wording</li>
<li>Updated stable label cross-reference to C++23</li>
</ul></li>
<li>Close all open LWG issues on the removed feature</li>
</ul>
<h2 class="unnumbered" id="r0-varna-2023">R0: Varna 2023<a href="#r0-varna-2023" class="self-link"></a></h2>
<p>Original version of this document, extracted from the C++23 proposal
<span class="citation" data-cites="P2139R2">[<a href="#ref-P2139R2" role="doc-biblioref">P2139R2</a>]</span>.</p>
<p>Key changes since that earlier paper:</p>
<ul>
<li>Rebased wording onto N4944</li>
</ul>
<h1 data-number="3" id="intro"><span class="header-section-number">3</span> Introduction<a href="#intro" class="self-link"></a></h1>
<p>At the start of the C++23 cycle, <span class="citation" data-cites="P2139R2">[<a href="#ref-P2139R2" role="doc-biblioref">P2139R2</a>]</span> tried to review each deprecated
feature of C++, to see which we would benefit from actively removing,
and which might now be better undeprecated. Consolidating all this
analysis into one place was intended to ease the (L)EWG review process,
but in return gave the author so much feedback that the next revision of
that paper was not completed.</p>
<p>For the C++26 cycle there will be a concise paper tracking the
overall review process, <span class="citation" data-cites="P2863R1">[<a href="#ref-P2863R1" role="doc-biblioref">P2863R1</a>]</span>, but all
changes to the standard will be pursued through specific papers,
decoupling progress from the larger paper so that delays on a single
feature do not hold up progress on all.</p>
<p>This paper takes up the deprecated
<code class="sourceCode default">strstream</code> facility from the
original C++98 standard, <span>D.14
<a href="https://wg21.link/depr.str.strstreams">[depr.str.strstreams]</a></span>.</p>
<h1 data-number="4" id="intro.origin"><span class="header-section-number">4</span> Origin<a href="#intro.origin" class="self-link"></a></h1>
<p>The <code class="sourceCode default">char*</code> streams were
provided, pre-deprecated, in C++98 and have been considered for removal
before. The underlying principle of previous reviews is that this
facility not be removed until suitable replacement functionality is
available in the standard for users to migrate to.</p>
<h1 data-number="5" id="analysis"><span class="header-section-number">5</span> Analysis<a href="#analysis" class="self-link"></a></h1>
<p>C++20 landed the ability to move strings efficiently out of
stringstreams in <span class="citation" data-cites="P0408R7">[<a href="#ref-P0408R7" role="doc-biblioref">P0408R7</a>]</span>. C++23
landed the <code class="sourceCode default">spanstream</code> library
<span class="citation" data-cites="P0448R4">[<a href="#ref-P0448R4" role="doc-biblioref">P0448R4</a>]</span>, which is a candidate for the
replacement functionality, so for C++26 we can seriously consider
removing this legacy feature, the largest and oldest deprecated feature
in the standard. The Zombie Names clause provides library vendors the
ability to retain support for these libraries long after the standard
has stopped specifying them. Therefore the preferred recommendation of
this paper is to finally remove this library from the C++26
Standard.</p>
<p>There remains the alternative position that this facility has been a
supported shipping part of the C++ Standard for almost 30 years when
C++26 ships. If we have not made serious moves to remove the library in
all that time, maybe we should consider undeprecating, and taking away
the shadow of doubt over any code that reaches for this facility
today.</p>
<p>We note that there are two open issues that should be resolved as
part of any attempt to undeprecate this facility:</p>
<ul>
<li><span class="citation" data-cites="LWG3095">[<a href="#ref-LWG3095" role="doc-biblioref">LWG3095</a>]</span>
<code class="sourceCode default">strstreambuf</code> refers to
nonexistent member of <code class="sourceCode default">fpos</code>,
<code class="sourceCode default">fpos::offset</code></li>
<li><span class="citation" data-cites="LWG3109">[<a href="#ref-LWG3109" role="doc-biblioref">LWG3109</a>]</span>
<code class="sourceCode default">strstreambuf</code> is copyable</li>
</ul>
<p>Both issues could be closed without further work if the
<code class="sourceCode default">char *</code> streams are removed.</p>
<h1 data-number="6" id="prop"><span class="header-section-number">6</span> Proposal<a href="#prop" class="self-link"></a></h1>
<p>Remove the long deprecated
<code class="sourceCode default">char *</code> streams from C++26.</p>
<h1 data-number="7" id="wording"><span class="header-section-number">7</span> Wording<a href="#wording" class="self-link"></a></h1>
<p>Make the following changes to the C++ Working Draft. All wording is
relative to <span class="citation" data-cites="N4958">[<a href="#ref-N4958" role="doc-biblioref">N4958</a>]</span>, the latest
draft at the time of writing.</p>
<h2 data-number="7.1" id="strike-strstream-from-the-list-of-standard-headers"><span class="header-section-number">7.1</span> Strike
<code class="sourceCode default">&lt;strstream&gt;</code> from the list
of standard headers<a href="#strike-strstream-from-the-list-of-standard-headers" class="self-link"></a></h2>
<h3 class="unnumbered" id="headers-headers"><span>16.4.2.3
<a href="https://wg21.link/headers">[headers]</a></span> Headers<a href="#headers-headers" class="self-link"></a></h3>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
The C++ standard library provides the <em>C++ library headers</em>,
shown in Table 24.</p>
<p>Table 24: C++ library headers [tab:headers.cpp]</p>
<table>
<colgroup>
<col style="width: 26%" />
<col style="width: 24%" />
<col style="width: 24%" />
<col style="width: 24%" />
</colgroup>
<tbody>
<tr class="odd">
<td><code class="sourceCode default">&lt;algorithm&gt;</code></td>
<td><code class="sourceCode default">&lt;format&gt;</code></td>
<td><code class="sourceCode default">&lt;new&gt;</code></td>
<td><code class="sourceCode default">&lt;stdexcept&gt;</code></td>
</tr>
<tr class="even">
<td><code class="sourceCode default">&lt;any&gt;</code></td>
<td><code class="sourceCode default">&lt;forward_list&gt;</code></td>
<td><code class="sourceCode default">&lt;numbers&gt;</code></td>
<td><code class="sourceCode default">&lt;stdfloat&gt;</code></td>
</tr>
<tr class="odd">
<td><code class="sourceCode default">&lt;array&gt;</code></td>
<td><code class="sourceCode default">&lt;fstream&gt;</code></td>
<td><code class="sourceCode default">&lt;numeric&gt;</code></td>
<td><code class="sourceCode default">&lt;stop_token&gt;</code></td>
</tr>
<tr class="even">
<td><code class="sourceCode default">&lt;atomic&gt;</code></td>
<td><code class="sourceCode default">&lt;functional&gt;</code></td>
<td><code class="sourceCode default">&lt;optional&gt;</code></td>
<td><code class="sourceCode default">&lt;streambuf&gt;</code></td>
</tr>
<tr class="odd">
<td><code class="sourceCode default">&lt;barrier&gt;</code></td>
<td><code class="sourceCode default">&lt;future&gt;</code></td>
<td><code class="sourceCode default">&lt;ostream&gt;</code></td>
<td><code class="sourceCode default">&lt;string&gt;</code></td>
</tr>
<tr class="even">
<td><code class="sourceCode default">&lt;bit&gt;</code></td>
<td><code class="sourceCode default">&lt;generator&gt;</code></td>
<td><code class="sourceCode default">&lt;print&gt;</code></td>
<td><code class="sourceCode default">&lt;string_view&gt;</code></td>
</tr>
<tr class="odd">
<td><code class="sourceCode default">&lt;bitset&gt;</code></td>
<td><code class="sourceCode default">&lt;initializer_list&gt;</code></td>
<td><code class="sourceCode default">&lt;queue&gt;</code></td>
<td><span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">&lt;strstream&gt;</code></span></del></span></td>
</tr>
<tr class="even">
<td><code class="sourceCode default">&lt;charconv&gt;</code></td>
<td><code class="sourceCode default">&lt;iomanip&gt;</code></td>
<td><code class="sourceCode default">&lt;random&gt;</code></td>
<td><code class="sourceCode default">&lt;syncstream&gt;</code></td>
</tr>
<tr class="odd">
<td><code class="sourceCode default">&lt;chrono&gt;</code></td>
<td><code class="sourceCode default">&lt;ios&gt;</code></td>
<td><code class="sourceCode default">&lt;ranges&gt;</code></td>
<td><code class="sourceCode default">&lt;system_error&gt;</code></td>
</tr>
<tr class="even">
<td><code class="sourceCode default">&lt;codecvt&gt;</code></td>
<td><code class="sourceCode default">&lt;iosfwd&gt;</code></td>
<td><code class="sourceCode default">&lt;ratio&gt;</code></td>
<td><code class="sourceCode default">&lt;text_encoding&gt;</code></td>
</tr>
<tr class="odd">
<td><code class="sourceCode default">&lt;compare&gt;</code></td>
<td><code class="sourceCode default">&lt;iostream&gt;</code></td>
<td><code class="sourceCode default">&lt;rcu&gt;</code></td>
<td><code class="sourceCode default">&lt;thread&gt;</code></td>
</tr>
<tr class="even">
<td><code class="sourceCode default">&lt;complex&gt;</code></td>
<td><code class="sourceCode default">&lt;istream&gt;</code></td>
<td><code class="sourceCode default">&lt;regex&gt;</code></td>
<td><code class="sourceCode default">&lt;tuple&gt;</code></td>
</tr>
<tr class="odd">
<td><code class="sourceCode default">&lt;concepts&gt;</code></td>
<td><code class="sourceCode default">&lt;iterator&gt;</code></td>
<td><code class="sourceCode default">&lt;scoped_allocator&gt;</code></td>
<td><code class="sourceCode default">&lt;type_traits&gt;</code></td>
</tr>
<tr class="even">
<td><code class="sourceCode default">&lt;condition_variable&gt;</code></td>
<td><code class="sourceCode default">&lt;latch&gt;</code></td>
<td><code class="sourceCode default">&lt;semaphore&gt;</code></td>
<td><code class="sourceCode default">&lt;typeindex&gt;</code></td>
</tr>
<tr class="odd">
<td><code class="sourceCode default">&lt;coroutine&gt;</code></td>
<td><code class="sourceCode default">&lt;limits&gt;</code></td>
<td><code class="sourceCode default">&lt;set&gt;</code></td>
<td><code class="sourceCode default">&lt;typeinfo&gt;</code></td>
</tr>
<tr class="even">
<td><code class="sourceCode default">&lt;deque&gt;</code></td>
<td><code class="sourceCode default">&lt;list&gt;</code></td>
<td><code class="sourceCode default">&lt;shared_mutex&gt;</code></td>
<td><code class="sourceCode default">&lt;unordered_map&gt;</code></td>
</tr>
<tr class="odd">
<td><code class="sourceCode default">&lt;exception&gt;</code></td>
<td><code class="sourceCode default">&lt;locale&gt;</code></td>
<td><code class="sourceCode default">&lt;source_location&gt;</code></td>
<td><code class="sourceCode default">&lt;unordered_set&gt;</code></td>
</tr>
<tr class="even">
<td><code class="sourceCode default">&lt;execution&gt;</code></td>
<td><code class="sourceCode default">&lt;map&gt;</code></td>
<td><code class="sourceCode default">&lt;span&gt;</code></td>
<td><code class="sourceCode default">&lt;utility&gt;</code></td>
</tr>
<tr class="odd">
<td><code class="sourceCode default">&lt;expected&gt;</code></td>
<td><code class="sourceCode default">&lt;mdspan&gt;</code></td>
<td><code class="sourceCode default">&lt;spanstream&gt;</code></td>
<td><code class="sourceCode default">&lt;valarray&gt;</code></td>
</tr>
<tr class="even">
<td><code class="sourceCode default">&lt;filesystem&gt;</code></td>
<td><code class="sourceCode default">&lt;memory&gt;</code></td>
<td><code class="sourceCode default">&lt;sstream&gt;</code></td>
<td><code class="sourceCode default">&lt;variant&gt;</code></td>
</tr>
<tr class="odd">
<td><code class="sourceCode default">&lt;flat_map&gt;</code></td>
<td><code class="sourceCode default">&lt;memory_resource&gt;</code></td>
<td><code class="sourceCode default">&lt;stack&gt;</code></td>
<td><code class="sourceCode default">&lt;vector&gt;</code></td>
</tr>
<tr class="even">
<td><code class="sourceCode default">&lt;flat_set&gt;</code></td>
<td><code class="sourceCode default">&lt;mutex&gt;</code></td>
<td><code class="sourceCode default">&lt;stacktrace&gt;</code></td>
<td><code class="sourceCode default">&lt;version&gt;</code></td>
</tr>
</tbody>
</table>
<h2 data-number="7.2" id="add-new-identifiers-to-zombie.names."><span class="header-section-number">7.2</span> Add new identifiers to
<span>16.4.5.3.2
<a href="https://wg21.link/zombie.names">[zombie.names]</a></span>.<a href="#add-new-identifiers-to-zombie.names." class="self-link"></a></h2>
<h3 class="unnumbered" id="zombie.names-zombie-names"><span>16.4.5.3.2
<a href="https://wg21.link/zombie.names">[zombie.names]</a></span>
Zombie names<a href="#zombie.names-zombie-names" class="self-link"></a></h3>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
In namespace <code class="sourceCode default">std</code>, the following
names are reserved for previous standardization:</p>
<ul>
<li><code class="sourceCode default">auto_ptr</code>,</li>
<li><code class="sourceCode default">auto_ptr_ref</code>,</li>
<li><code class="sourceCode default">binary_function</code>,</li>
<li><code class="sourceCode default">binary_negate</code>,</li>
<li><code class="sourceCode default">bind1st</code>,</li>
<li><code class="sourceCode default">bind2nd</code>,</li>
<li><code class="sourceCode default">binder1st</code>,</li>
<li><code class="sourceCode default">binder2nd</code>,</li>
<li><code class="sourceCode default">const_mem_fun1_ref_t</code>,</li>
<li><code class="sourceCode default">const_mem_fun1_t</code>,</li>
<li><code class="sourceCode default">const_mem_fun_ref_t</code>,</li>
<li><code class="sourceCode default">const_mem_fun_t</code>,</li>
<li><code class="sourceCode default">declare_no_pointers</code>,</li>
<li><code class="sourceCode default">declare_reachable</code>,</li>
<li><code class="sourceCode default">get_pointer_safety</code>,</li>
<li><code class="sourceCode default">get_temporary_buffer</code>,</li>
<li><code class="sourceCode default">get_unexpected</code>,</li>
<li><code class="sourceCode default">gets</code>,</li>
<li><code class="sourceCode default">is_literal_type</code>,</li>
<li><code class="sourceCode default">is_literal_type_v</code>,</li>
<li><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">istrstream</code></span>,</ins></span></li>
<li><code class="sourceCode default">mem_fun1_ref_t</code>,</li>
<li><code class="sourceCode default">mem_fun1_t</code>,</li>
<li><code class="sourceCode default">mem_fun_ref_t</code>,</li>
<li><code class="sourceCode default">mem_fun_ref</code>,</li>
<li><code class="sourceCode default">mem_fun_t</code>,</li>
<li><code class="sourceCode default">mem_fun</code>,</li>
<li><code class="sourceCode default">not1</code>,</li>
<li><code class="sourceCode default">not2</code>,</li>
<li><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">ostrstream</code></span>,</ins></span></li>
<li><code class="sourceCode default">pointer_safety</code></li>
<li><code class="sourceCode default">pointer_to_binary_function</code>,</li>
<li><code class="sourceCode default">pointer_to_unary_function</code>,</li>
<li><code class="sourceCode default">ptr_fun</code>,</li>
<li><code class="sourceCode default">random_shuffle</code>,</li>
<li><code class="sourceCode default">raw_storage_iterator</code>,</li>
<li><code class="sourceCode default">result_of</code>,</li>
<li><code class="sourceCode default">result_of_t</code>,</li>
<li><code class="sourceCode default">return_temporary_buffer</code>,</li>
<li><code class="sourceCode default">set_unexpected</code>,</li>
<li><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">strstream</code></span>,</ins></span></li>
<li><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">strstreambuf</code></span>,</ins></span></li>
<li><code class="sourceCode default">unary_function</code>,</li>
<li><code class="sourceCode default">unary_negate</code>,</li>
<li><code class="sourceCode default">uncaught_exception</code>,</li>
<li><code class="sourceCode default">undeclare_no_pointers</code>,</li>
<li><code class="sourceCode default">undeclare_reachable</code>,
and</li>
<li><code class="sourceCode default">unexpected_handler</code>.</li>
</ul>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
The following names are reserved as members for previous
standardization, and may not be used as a name for object-like macros in
portable code:</p>
<ul>
<li><code class="sourceCode default">argument_type</code>,</li>
<li><code class="sourceCode default">first_argument_type</code>,</li>
<li><code class="sourceCode default">io_state</code>,</li>
<li><code class="sourceCode default">open_mode</code>,</li>
<li><code class="sourceCode default">preferred</code>,</li>
<li><code class="sourceCode default">second_argument_type</code>,</li>
<li><code class="sourceCode default">seek_dir</code>, and</li>
<li><code class="sourceCode default">strict</code>.</li>
</ul>
<p><span class="marginalizedparent"><a class="marginalized">3</a></span>
The <span class="rm" style="color: #bf0303"><del>name
<span><code class="sourceCode default">stossc</code></span> is reserved
as a member function</del></span> <span class="add" style="color: #006e28"><ins>following names are reserved as member
functions</ins></span> for previous standardization, and may not be used
as a name for function-like macros in portable code.</p>
<div class="add" style="color: #006e28">

<ul>
<li><code class="sourceCode default">freeze</code>,</li>
<li><code class="sourceCode default">pcount</code>, and</li>
<li><code class="sourceCode default">stossc</code></li>
</ul>

</div>
<p><span class="marginalizedparent"><a class="marginalized">4</a></span>
The header names
<code class="sourceCode default">&lt;ccomplex&gt;</code>,
<code class="sourceCode default">&lt;ciso646&gt;</code>,
<code class="sourceCode default">&lt;cstdalign&gt;</code>,
<code class="sourceCode default">&lt;cstdbool&gt;</code>, <span class="rm" style="color: #bf0303"><del>and</del></span>
<code class="sourceCode default">&lt;ctgmath&gt;</code><span class="add" style="color: #006e28"><ins>, and
<span><code class="sourceCode default">&lt;strstream</code></span>&gt;</ins></span>
are reserved for previous standardization.</p>
<h2 data-number="7.3" id="update-annex-c"><span class="header-section-number">7.3</span> Update Annex C:<a href="#update-annex-c" class="self-link"></a></h2>
<div class="add" style="color: #006e28">

<h3 class="unnumbered" id="c.1.x-annex-d-compatibility-features-diff.cpp23.depr">C.1.X Annex D:
compatibility features [diff.cpp23.depr]<a href="#c.1.x-annex-d-compatibility-features-diff.cpp23.depr" class="self-link"></a></h3>
<p><strong>Change:</strong> Remove header
<code class="sourceCode default">&lt;strstream&gt;</code> and all its
contents.</p>
<p><strong>Rationale:</strong> The header has been deprecated since the
original C++ Standard, as its facilities required more care to user
correctly than preferred to parts of the C++ Standard Library; the
<code class="sourceCode default">&lt;spanstream&gt;</code> header
provides an updated safer facility. Ongoing support remains at
implementer’s discretion, exercising freedoms granted by
<span>16.4.5.3.2
<a href="https://wg21.link/zombie.names">[zombie.names]</a></span>.</p>
<p><strong>Effect on original feature:</strong> A valid C++ 2023 program
<code class="sourceCode default">#include</code>-ing the header may fail
to compile. Code that uses any of the following classes by importing one
of the standard library modules may fail to compile:</p>
<ul>
<li><code class="sourceCode default">istrstream</code></li>
<li><code class="sourceCode default">ostrstream</code></li>
<li><code class="sourceCode default">strstream</code></li>
<li><code class="sourceCode default">strstreambuf</code></li>
</ul>

</div>
<h2 data-number="7.4" id="strike-all-of-depr.str.strstreams-char-streams"><span class="header-section-number">7.4</span> Strike all of <span>D.14
<a href="https://wg21.link/depr.str.strstreams">[depr.str.strstreams]</a></span>
<code class="sourceCode default">char *</code> streams<a href="#strike-all-of-depr.str.strstreams-char-streams" class="self-link"></a></h2>
<div class="rm" style="color: #bf0303">

<h3 class="unnumbered" id="depr.str.strstreams-char-streams"><span>D.14
<a href="https://wg21.link/depr.str.strstreams">[depr.str.strstreams]</a></span>
<code class="sourceCode default">char*</code> streams<a href="#depr.str.strstreams-char-streams" class="self-link"></a></h3>
<h3 class="unnumbered" id="depr.strstream.syn-header-strstream-synopsis"><span>D.14.1
<a href="https://wg21.link/depr.strstream.syn">[depr.strstream.syn]</a></span>
Header <code class="sourceCode default">&lt;strstream&gt;</code>
synopsis<a href="#depr.strstream.syn-header-strstream-synopsis" class="self-link"></a></h3>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
The header <code class="sourceCode default">&lt;strstream&gt;</code>
defines types that associate stream buffers with character array objects
and assist reading and writing such objects.</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a>namespace std {</span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a>    class strstreambuf;</span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a>    class istrstream;</span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a>    class ostrstream;</span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a>    class strstream;</span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a>}</span></code></pre></div>
<h3 class="unnumbered" id="depr.strstreambuf-class-strstreambuf"><span>D.14.2
<a href="https://wg21.link/depr.strstreambuf">[depr.strstreambuf]</a></span>
Class <code class="sourceCode default">strstreambuf</code><a href="#depr.strstreambuf-class-strstreambuf" class="self-link"></a></h3>
<h3 class="unnumbered" id="depr.strstreambuf.general-general"><span>D.14.2.1
<a href="https://wg21.link/depr.strstreambuf.general">[depr.strstreambuf.general]</a></span>
General<a href="#depr.strstreambuf.general-general" class="self-link"></a></h3>
<div class="sourceCode" id="cb2"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a>namespace std {</span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a>  class strstreambuf : public basic_streambuf&lt;char&gt; {</span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a>  public:</span>
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a>    strstreambuf() : strstreambuf(0) {}</span>
<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a>    explicit strstreambuf(streamsize alsize_arg);</span>
<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a>    strstreambuf(void* (*palloc_arg)(size_t), void (*pfree_arg)(void*));</span>
<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a>    strstreambuf(char* gnext_arg, streamsize n, char* pbeg_arg = nullptr);</span>
<span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a>    strstreambuf(const char* gnext_arg, streamsize n);</span>
<span id="cb2-9"><a href="#cb2-9" aria-hidden="true" tabindex="-1"></a>    strstreambuf(signed char* gnext_arg, streamsize n,</span>
<span id="cb2-10"><a href="#cb2-10" aria-hidden="true" tabindex="-1"></a>                 signed char* pbeg_arg = nullptr);</span>
<span id="cb2-11"><a href="#cb2-11" aria-hidden="true" tabindex="-1"></a>    strstreambuf(const signed char* gnext_arg, streamsize n);</span>
<span id="cb2-12"><a href="#cb2-12" aria-hidden="true" tabindex="-1"></a>    strstreambuf(unsigned char* gnext_arg, streamsize n,</span>
<span id="cb2-13"><a href="#cb2-13" aria-hidden="true" tabindex="-1"></a>                 unsigned char* pbeg_arg = nullptr);</span>
<span id="cb2-14"><a href="#cb2-14" aria-hidden="true" tabindex="-1"></a>    strstreambuf(const unsigned char* gnext_arg, streamsize n);</span>
<span id="cb2-15"><a href="#cb2-15" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-16"><a href="#cb2-16" aria-hidden="true" tabindex="-1"></a>    virtual ~strstreambuf();</span>
<span id="cb2-17"><a href="#cb2-17" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-18"><a href="#cb2-18" aria-hidden="true" tabindex="-1"></a>    void  freeze(bool freezefl = true);</span>
<span id="cb2-19"><a href="#cb2-19" aria-hidden="true" tabindex="-1"></a>    char* str();</span>
<span id="cb2-20"><a href="#cb2-20" aria-hidden="true" tabindex="-1"></a>    int   pcount();</span>
<span id="cb2-21"><a href="#cb2-21" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-22"><a href="#cb2-22" aria-hidden="true" tabindex="-1"></a>  protected:</span>
<span id="cb2-23"><a href="#cb2-23" aria-hidden="true" tabindex="-1"></a>    int_type overflow (int_type c = EOF) override;</span>
<span id="cb2-24"><a href="#cb2-24" aria-hidden="true" tabindex="-1"></a>    int_type pbackfail(int_type c = EOF) override;</span>
<span id="cb2-25"><a href="#cb2-25" aria-hidden="true" tabindex="-1"></a>    int_type underflow() override;</span>
<span id="cb2-26"><a href="#cb2-26" aria-hidden="true" tabindex="-1"></a>    pos_type seekoff(off_type off, ios_base::seekdir way,</span>
<span id="cb2-27"><a href="#cb2-27" aria-hidden="true" tabindex="-1"></a>                     ios_base::openmode which = ios_base::in | ios_base::out) override;</span>
<span id="cb2-28"><a href="#cb2-28" aria-hidden="true" tabindex="-1"></a>    pos_type seekpos(pos_type sp,</span>
<span id="cb2-29"><a href="#cb2-29" aria-hidden="true" tabindex="-1"></a>                     ios_base::openmode which = ios_base::in | ios_base::out) override;</span>
<span id="cb2-30"><a href="#cb2-30" aria-hidden="true" tabindex="-1"></a>    streambuf* setbuf(char* s, streamsize n) override;</span>
<span id="cb2-31"><a href="#cb2-31" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-32"><a href="#cb2-32" aria-hidden="true" tabindex="-1"></a>  private:</span>
<span id="cb2-33"><a href="#cb2-33" aria-hidden="true" tabindex="-1"></a>     using strstate = T1;                      <em>// exposition only</em></span>
<span id="cb2-34"><a href="#cb2-34" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-35"><a href="#cb2-35" aria-hidden="true" tabindex="-1"></a>     static const strstate allocated;          <em>// exposition only</em></span>
<span id="cb2-36"><a href="#cb2-36" aria-hidden="true" tabindex="-1"></a>     static const strstate constant;           <em>// exposition only</em></span>
<span id="cb2-37"><a href="#cb2-37" aria-hidden="true" tabindex="-1"></a>     static const strstate dynamic;            <em>// exposition only</em></span>
<span id="cb2-38"><a href="#cb2-38" aria-hidden="true" tabindex="-1"></a>     static const strstate frozen;             <em>// exposition only</em></span>
<span id="cb2-39"><a href="#cb2-39" aria-hidden="true" tabindex="-1"></a>     strstate strmode;                         <em>// exposition only</em></span>
<span id="cb2-40"><a href="#cb2-40" aria-hidden="true" tabindex="-1"></a>     streamsize alsize;                        <em>// exposition only</em></span>
<span id="cb2-41"><a href="#cb2-41" aria-hidden="true" tabindex="-1"></a>     void* (*palloc)(size_t);                  <em>// exposition only</em></span>
<span id="cb2-42"><a href="#cb2-42" aria-hidden="true" tabindex="-1"></a>     void (*pfree)(void*);                     <em>// exposition only</em></span>
<span id="cb2-43"><a href="#cb2-43" aria-hidden="true" tabindex="-1"></a>  };</span>
<span id="cb2-44"><a href="#cb2-44" aria-hidden="true" tabindex="-1"></a>}</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
The class <code class="sourceCode default">strstreambuf</code>
associates the input sequence, and possibly the output sequence, with an
object of some <em>character</em> array type, whose elements store
arbitrary values. The array object has several attributes.</p>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
[<em>Note 1:</em> For the sake of exposition, these are represented as
elements of a bitmask type (indicated here as T1) called strstate. The
elements are:]</p>
<p><span class="marginalizedparent"><a class="marginalized">3</a></span>
[<em>Note 2:</em> For the sake of exposition, the maintained data is
presented here as:]</p>
<p><span class="marginalizedparent"><a class="marginalized">4</a></span>
Each object of class
<code class="sourceCode default">strstreambuf</code> has a <em>seekable
area</em>, delimited by the pointers
<code class="sourceCode default">seeklow</code> and
<code class="sourceCode default">seekhigh</code>. If
<code class="sourceCode default">gnext</code> is a null pointer, the
seekable area is undefined. Otherwise,
<code class="sourceCode default">seeklow</code> equals
<code class="sourceCode default">gbeg</code> and
<code class="sourceCode default">seekhigh</code> is either
<code class="sourceCode default">pend</code>, if
<code class="sourceCode default">pend</code> is not a null pointer, or
<code class="sourceCode default">gend</code>.</p>
<h3 class="unnumbered" id="depr.strstreambuf.cons-strstreambuf-constructors"><span>D.14.2.2
<a href="https://wg21.link/depr.strstreambuf.cons">[depr.strstreambuf.cons]</a></span>
<code class="sourceCode default">strstreambuf</code> constructors<a href="#depr.strstreambuf.cons-strstreambuf-constructors" class="self-link"></a></h3>
<div class="sourceCode" id="cb3"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a>explicit strstreambuf(streamsize alsize_arg);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em>Effects:</em> Initializes the base class with
<code class="sourceCode default">streambuf()</code>. The postconditions
of this function are indicated in Table 147.</p>
<p>Table 147:
<code class="sourceCode default">strstreambuf(streamsize)</code> effects
[tab:depr.strstreambuf.cons.sz]</p>
<table>
<thead>
<tr class="header">
<th style="text-align: left;"><div style="text-align:center">
<strong>Element</strong>
</div></th>
<th style="text-align: left;"><div style="text-align:center">
<strong>Value</strong>
</div></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;"><code class="sourceCode default">strmode</code></td>
<td style="text-align: left;"><code class="sourceCode default">dynamic</code></td>
</tr>
<tr class="even">
<td style="text-align: left;"><code class="sourceCode default">alsize</code></td>
<td style="text-align: left;"><code class="sourceCode default">alsize_arg</code></td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code class="sourceCode default">palloc</code></td>
<td style="text-align: left;">a null pointer</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code class="sourceCode default">pfree</code></td>
<td style="text-align: left;">a null pointer</td>
</tr>
</tbody>
</table>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Effects:</em> Initializes the base class with
<code class="sourceCode default">streambuf()</code>. The postconditions
of this function are indicated in Table 148.</p>
<p>Table 148: <code class="sourceCode default">strstreambuf(void* (*)(size_t), void (*)(void*))</code>
effects</p>
<table>
<thead>
<tr class="header">
<th style="text-align: left;"><div style="text-align:center">
<strong>Element</strong>
</div></th>
<th style="text-align: left;"><div style="text-align:center">
<strong>Value</strong>
</div></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;"><code class="sourceCode default">strmode</code></td>
<td style="text-align: left;"><code class="sourceCode default">dynamic</code></td>
</tr>
<tr class="even">
<td style="text-align: left;"><code class="sourceCode default">alsize</code></td>
<td style="text-align: left;">an unspecified value</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code class="sourceCode default">palloc</code></td>
<td style="text-align: left;"><code class="sourceCode default">palloc_arg</code></td>
</tr>
<tr class="even">
<td style="text-align: left;"><code class="sourceCode default">pfree</code></td>
<td style="text-align: left;"><code class="sourceCode default">pfree_arg</code></td>
</tr>
</tbody>
</table>
<div class="sourceCode" id="cb4"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a>strstreambuf(char* gnext_arg, streamsize n, char* pbeg_arg = nullptr);</span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a>strstreambuf(signed char* gnext_arg, streamsize n,</span>
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a>             signed char* pbeg_arg = nullptr);</span>
<span id="cb4-5"><a href="#cb4-5" aria-hidden="true" tabindex="-1"></a>strstreambuf(unsigned char* gnext_arg, streamsize n,</span>
<span id="cb4-6"><a href="#cb4-6" aria-hidden="true" tabindex="-1"></a>             unsigned char* pbeg_arg = nullptr);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">3</a></span>
<em>Effects:</em> Initializes the base class with
<code class="sourceCode default">streambuf()</code>. The postconditions
of this function are indicated in Table 149.</p>
<p>Table 149: <code class="sourceCode default">strstreambuf(charT*, streamsize, charT*)</code>
effects [tab:depr.strstreambuf.cons.ptr]</p>
<table>
<thead>
<tr class="header">
<th style="text-align: left;"><div style="text-align:center">
<strong>Element</strong>
</div></th>
<th style="text-align: left;"><div style="text-align:center">
<strong>Value</strong>
</div></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;"><code class="sourceCode default">strmode</code></td>
<td style="text-align: left;">0</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code class="sourceCode default">alsize</code></td>
<td style="text-align: left;">an unspecified value</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code class="sourceCode default">palloc</code></td>
<td style="text-align: left;">a null pointer</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code class="sourceCode default">pfree</code></td>
<td style="text-align: left;">a null pointer</td>
</tr>
</tbody>
</table>
<p><span class="marginalizedparent"><a class="marginalized">4</a></span>
<code class="sourceCode default">gnext_arg</code> shall point to the
first element of an array object whose number of elements
<code class="sourceCode default">N</code> is determined as follows:</p>
<ul>
<li>If <code class="sourceCode default">n &gt; 0</code>,
<code class="sourceCode default">N</code> is
<code class="sourceCode default">n</code>.</li>
<li>If <code class="sourceCode default">n == 0</code>,
<code class="sourceCode default">N</code> is
<code class="sourceCode default">std::strlen(gnext_arg)</code>.</li>
<li>If <code class="sourceCode default">n &lt; 0</code>,
<code class="sourceCode default">N</code> is
<code class="sourceCode default">INT_MAX</code>.<a href="#fn1" class="footnote-ref" id="fnref1" role="doc-noteref"><sup>1</sup></a></li>
</ul>
<p><span class="marginalizedparent"><a class="marginalized">5</a></span>
If <code class="sourceCode default">pbeg_arg</code> is a null pointer,
the function executes:</p>
<div class="sourceCode" id="cb5"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a>   setg(gnext_arg, gnext_arg, gnext_arg + N);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">6</a></span>
Otherwise, the function executes:</p>
<div class="sourceCode" id="cb6"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a>   setg(gnext_arg, gnext_arg, pbeg_arg);</span>
<span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a>   setp(pbeg_arg,  pbeg_arg + N);</span></code></pre></div>
<div class="sourceCode" id="cb7"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a>strstreambuf(const char* gnext_arg, streamsize n);</span>
<span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a>strstreambuf(const signed char* gnext_arg, streamsize n);</span>
<span id="cb7-3"><a href="#cb7-3" aria-hidden="true" tabindex="-1"></a>strstreambuf(const unsigned char* gnext_arg, streamsize n);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">7</a></span>
<em>Effects:</em> Behaves the same as
<code class="sourceCode default">strstreambuf((char*)gnext_arg,n)</code>,
except that the constructor also sets constant in
<code class="sourceCode default">strmode</code>.</p>
<div class="sourceCode" id="cb8"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a>virtual ~strstreambuf();</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">8</a></span>
<em>Effects:</em> Destroys an object of class
<code class="sourceCode default">strstreambuf</code>. The function frees
the dynamically allocated array object only if
<code class="sourceCode default">(strmode &amp; allocated) != 0</code>
and <code class="sourceCode default">(strmode &amp; frozen) == 0</code>.
(<span>D.14.2.4
<a href="https://wg21.link/depr.strstreambuf.virtuals">[depr.strstreambuf.virtuals]</a></span>
describes how a dynamically allocated array object is freed.)</p>
<h3 class="unnumbered" id="depr.strstreambuf.members-member-functions"><span>D.14.2.3
<a href="https://wg21.link/depr.strstreambuf.members">[depr.strstreambuf.members]</a></span>
Member functions<a href="#depr.strstreambuf.members-member-functions" class="self-link"></a></h3>
<div class="sourceCode" id="cb9"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true" tabindex="-1"></a>void freeze(bool freezefl = true);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em>Effects:</em> If
<code class="sourceCode default">strmode &amp; dynamic</code> is
nonzero, alters the freeze status of the dynamic array object as
follows:</p>
<ul>
<li>If <code class="sourceCode default">freezefl</code> is
<code class="sourceCode default">true</code>, the function sets
<code class="sourceCode default">frozen</code> in
<code class="sourceCode default">strmode</code>.</li>
<li>Otherwise, it clears <code class="sourceCode default">frozen</code>
in <code class="sourceCode default">strmode</code>.</li>
</ul>
<div class="sourceCode" id="cb10"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb10-2"><a href="#cb10-2" aria-hidden="true" tabindex="-1"></a>char* str();</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Effects:</em> Calls
<code class="sourceCode default">freeze()</code>, then returns the
beginning pointer for the input sequence,
<code class="sourceCode default">gbeg</code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">3</a></span>
<em>Remarks:</em> The return value can be a null pointer.</p>
<div class="sourceCode" id="cb11"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb11-2"><a href="#cb11-2" aria-hidden="true" tabindex="-1"></a>int pcount() const;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">4</a></span>
<em>Effects:</em> If the next pointer for the output sequence,
<code class="sourceCode default">pnext</code>, is a null pointer,
returns zero. Otherwise, returns the current effective length of the
array object as the next pointer minus the beginning pointer for the
output sequence,
<code class="sourceCode default">pnext - pbeg</code>.</p>
<h3 class="unnumbered" id="depr.strstreambuf.virtuals-strstreambuf-overridden-virtual-functions"><span>D.14.2.4
<a href="https://wg21.link/depr.strstreambuf.virtuals">[depr.strstreambuf.virtuals]</a></span>
<code class="sourceCode default">strstreambuf</code> overridden virtual
functions<a href="#depr.strstreambuf.virtuals-strstreambuf-overridden-virtual-functions" class="self-link"></a></h3>
<div class="sourceCode" id="cb12"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true" tabindex="-1"></a>int_type overflow(int_type c = EOF) override;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em>Effects:</em> Appends the character designated by
<code class="sourceCode default">c</code> to the output sequence, if
possible, in one of two ways:</p>
<ul>
<li>If <code class="sourceCode default">c != EOF</code> and if either
the output sequence has a write position available or the function makes
a write position available (as described below), assigns
<code class="sourceCode default">c</code> to
<code class="sourceCode default">*pnext++</code>.<br />
Returns <code class="sourceCode default">(unsigned char)c</code>.</li>
<li>If <code class="sourceCode default">c == EOF</code>, there is no
character to append.<br />
Returns a value other than
<code class="sourceCode default">EOF</code>.</li>
</ul>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
Returns <code class="sourceCode default">EOF</code> to indicate
failure.</p>
<p><span class="marginalizedparent"><a class="marginalized">3</a></span>
<em>Remarks:</em> The function can alter the number of write positions
available as a result of any call.</p>
<p><span class="marginalizedparent"><a class="marginalized">4</a></span>
To make a write position available, the function reallocates (or
initially allocates) an array object with a sufficient number of
elements <code class="sourceCode default">n</code> to hold the current
array object (if any), plus at least one additional write position. How
many additional write positions are made available is otherwise
unspecified. If <code class="sourceCode default">palloc</code> is not a
null pointer, the function calls
<code class="sourceCode default">(*palloc)(n)</code> to allocate the new
dynamic array object. Otherwise, it evaluates the expression
<code class="sourceCode default">new charT[n]</code>. In either case, if
the allocation fails, the function returns
<code class="sourceCode default">EOF</code>. Otherwise, it sets
<code class="sourceCode default">allocated</code> in
<code class="sourceCode default">strmode</code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">5</a></span>
To free a previously existing dynamic array object whose first element
address is <code class="sourceCode default">p</code>: If
<code class="sourceCode default">pfree</code> is not a null pointer, the
function calls <code class="sourceCode default">(*pfree)(p)</code>.
Otherwise, it evaluates the expression
<code class="sourceCode default">delete[]p</code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">6</a></span>
If <code class="sourceCode default">(strmode &amp; dynamic) == 0</code>,
or if
<code class="sourceCode default">(strmode &amp; frozen) != 0</code>, the
function cannot extend the array (reallocate it with greater length) to
make a write position available.</p>
<p><span class="marginalizedparent"><a class="marginalized">7</a></span>
<em>Recommended practice:</em> An implementation should consider
<code class="sourceCode default">alsize</code> in making the decision
how many additional write positions to make available.</p>
<div class="sourceCode" id="cb13"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb13-2"><a href="#cb13-2" aria-hidden="true" tabindex="-1"></a>int_type pbackfail(int_type c = EOF) override;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">8</a></span>
Puts back the character designated by c to the input sequence, if
possible, in one of three ways:</p>
<ul>
<li>If <code class="sourceCode default">c != EOF</code>, if the input
sequence has a putback position available, and if
<code class="sourceCode default">(char)c == gnext[-1]</code>, assigns
<code class="sourceCode default">gnext - 1</code> to
<code class="sourceCode default">gnext</code>.<br />
Returns <code class="sourceCode default">c</code>.</li>
<li>If c != EOF, if the input sequence has a putback position available,
and if <code class="sourceCode default">strmode &amp; constant</code> is
zero, assigns <code class="sourceCode default">c</code> to
<code class="sourceCode default">*--gnext</code>.<br />
Returns c.</li>
<li>If <code class="sourceCode default">c == EOF</code> and if the input
sequence has a putback position available, assigns
<code class="sourceCode default">gnext - 1</code> to
<code class="sourceCode default">gnext</code>.<br />
Returns a value other than
<code class="sourceCode default">EOF</code>.</li>
</ul>
<p><span class="marginalizedparent"><a class="marginalized">9</a></span>
Returns <code class="sourceCode default">EOF</code> to indicate
failure.</p>
<p><span class="marginalizedparent"><a class="marginalized">10</a></span>
<em>Remarks:</em> If the function can succeed in more than one of these
ways, it is unspecified which way is chosen. The function can alter the
number of putback positions available as a result of any call.</p>
<div class="sourceCode" id="cb14"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb14-1"><a href="#cb14-1" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb14-2"><a href="#cb14-2" aria-hidden="true" tabindex="-1"></a>int_type underflow() override;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">11</a></span>
<em>Effects:</em> Reads a character from the input sequence, if
possible, without moving the stream position past it, as follows:</p>
<ul>
<li>If the input sequence has a read position available, the function
signals success by returning
<code class="sourceCode default">(unsigned char)*gnext</code>.</li>
<li>Otherwise, if the current write next pointer
<code class="sourceCode default">pnext</code> is not a null pointer and
is greater than the current read end pointer
<code class="sourceCode default">gend</code>, makes a <em>read
position</em> available by assigning to
<code class="sourceCode default">gend</code> a value greater than
<code class="sourceCode default">gnext</code> and no greater than
<code class="sourceCode default">pnext</code>.<br />
Returns
<code class="sourceCode default">(unsigned char)*gnext.</code></li>
</ul>
<p><span class="marginalizedparent"><a class="marginalized">12</a></span> Returns
<code class="sourceCode default">EOF</code> to indicate failure.</p>
<p><span class="marginalizedparent"><a class="marginalized">13</a></span>
<em>Remarks:</em> The function can alter the number of read positions
available as a result of any call.</p>
<div class="sourceCode" id="cb15"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb15-1"><a href="#cb15-1" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb15-2"><a href="#cb15-2" aria-hidden="true" tabindex="-1"></a>pos_type seekoff(off_type off, seekdir way, openmode which = in | out) override;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">14</a></span>
<em>Effects:</em> Alters the stream position within one of the
controlled sequences, if possible, as indicated in Table 150.</p>
<p>Table 150: seekoff positioning
[tab:depr.strstreambuf.seekoff.pos]</p>
<table>
<colgroup>
<col style="width: 53%" />
<col style="width: 46%" />
</colgroup>
<tbody>
<tr class="odd">
<td>Conditions</td>
<td>Result</td>
</tr>
<tr class="even">
<td><code class="sourceCode default">(which &amp; ios::in) != 0</code></td>
<td>positions the input sequence</td>
</tr>
<tr class="odd">
<td><code class="sourceCode default">(which &amp; ios::out) != 0</code></td>
<td>positions the output sequence</td>
</tr>
<tr class="even">
<td><code class="sourceCode default">(which &amp; (ios::in | ios::out)) == (ios::in | ios::out)</code>
and either <code class="sourceCode default">way == ios::beg</code> or
<code class="sourceCode default">way == ios::end</code></td>
<td>positions both the input and the output sequences</td>
</tr>
<tr class="odd">
<td>Otherwise</td>
<td>the positioning operation fails.</td>
</tr>
</tbody>
</table>
<p><span class="marginalizedparent"><a class="marginalized">15</a></span> For a
sequence to be positioned, if its next pointer is a null pointer, the
positioning operation fails. Otherwise, the function determines
<code class="sourceCode default">newoff</code> as indicated in Table
151.</p>
<p>Table 151: newoff values [tab:depr.strstreambuf.seekoff.newoff]</p>
<table>
<colgroup>
<col style="width: 23%" />
<col style="width: 76%" />
</colgroup>
<tbody>
<tr class="odd">
<td>Condition</td>
<td><code class="sourceCode default">newoff</code> Value</td>
</tr>
<tr class="even">
<td><code class="sourceCode default">way == ios::beg</code></td>
<td>0</td>
</tr>
<tr class="odd">
<td><code class="sourceCode default">way == ios::cur</code></td>
<td>the next pointer minus the beginning pointer
(<code class="sourceCode default">xnext - xbeg</code>).</td>
</tr>
<tr class="even">
<td><code class="sourceCode default">way == ios::end</code></td>
<td>seekhigh minus the beginning pointer
(<code class="sourceCode default">seekhigh - xbeg</code>).</td>
</tr>
</tbody>
</table>
<p><span class="marginalizedparent"><a class="marginalized">16</a></span> If
<code class="sourceCode default">(newoff + off) &lt; (seeklow - xbeg)</code>
or <code class="sourceCode default">(seekhigh - xbeg) &lt; (newoff + off)</code>,
the positioning operation fails. Otherwise, the function assigns
<code class="sourceCode default">xbeg + newoff + off</code> to the next
pointer <code class="sourceCode default">xnext</code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">17</a></span>
<em>Returns:</em>
<code class="sourceCode default">pos_type(newoff)</code>, constructed
from the resultant offset <code class="sourceCode default">newoff</code>
(of type <code class="sourceCode default">off_type</code>), that stores
the resultant stream position, if possible. If the positioning operation
fails, or if the constructed object cannot represent the resultant
stream position, the return value is
<code class="sourceCode default">pos_type(off_type(-1))</code>.</p>
<div class="sourceCode" id="cb16"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb16-1"><a href="#cb16-1" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb16-2"><a href="#cb16-2" aria-hidden="true" tabindex="-1"></a>pos_type seekpos(pos_type sp, ios_base::openmode which = ios_base::in | ios_base::out) override;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">18</a></span>
<em>Effects:</em> Alters the stream position within one of the
controlled sequences, if possible, to correspond to the stream position
stored in <code class="sourceCode default">sp</code> (as described
below).</p>
<ul>
<li>If
<code class="sourceCode default">(which &amp; ios::in) != 0</code>,
positions the input sequence.</li>
<li>If
<code class="sourceCode default">(which &amp; ios::out) != 0</code>,
positions the output sequence.</li>
<li>If the function positions neither sequence, the positioning
operation fails.</li>
</ul>
<p><span class="marginalizedparent"><a class="marginalized">19</a></span> For a
sequence to be positioned, if its next pointer is a null pointer, the
positioning operation fails. Otherwise, the function determines
<code class="sourceCode default">newoff</code> from
<code class="sourceCode default">sp.offset()</code>:</p>
<ul>
<li>If <code class="sourceCode default">newoff</code> is an invalid
stream position, has a negative value, or has a value greater than
(<code class="sourceCode default">seekhigh - seeklow</code>), the
positioning operation fails</li>
<li>Otherwise, the function adds
<code class="sourceCode default">newoff</code> to the beginning pointer
<code class="sourceCode default">xbeg</code> and store the result in the
next pointer <code class="sourceCode default">xnext</code>.</li>
</ul>
<p><span class="marginalizedparent"><a class="marginalized">20</a></span>
<em>Returns:</em>
<code class="sourceCode default">pos_type(newoff)</code>, constructed
from the resultant offset <code class="sourceCode default">newoff</code>
(of type <code class="sourceCode default">off_type</code>), that stores
the resultant stream position, if possible. If the positioning operation
fails, or if the constructed object cannot represent the resultant
stream position, the return value is
<code class="sourceCode default">pos_type(off_type(-1))</code>.</p>
<div class="sourceCode" id="cb17"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb17-1"><a href="#cb17-1" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb17-2"><a href="#cb17-2" aria-hidden="true" tabindex="-1"></a>streambuf&lt;char&gt;* setbuf(char* s, streamsize n) override;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">21</a></span>
<em>Effects:</em> Behavior is implementation-defined, except that
<code class="sourceCode default">setbuf(0, 0)</code> has no effect.</p>
<h3 class="unnumbered" id="depr.istrstream-class-istrstream"><span>D.14.3
<a href="https://wg21.link/depr.istrstream">[depr.istrstream]</a></span>
Class <code class="sourceCode default">istrstream</code><a href="#depr.istrstream-class-istrstream" class="self-link"></a></h3>
<h3 class="unnumbered" id="depr.istrstream.general-general"><span>D.14.3.1
<a href="https://wg21.link/depr.istrstream.general">[depr.istrstream.general]</a></span>
General<a href="#depr.istrstream.general-general" class="self-link"></a></h3>
<div class="sourceCode" id="cb18"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb18-1"><a href="#cb18-1" aria-hidden="true" tabindex="-1"></a>namespace std {</span>
<span id="cb18-2"><a href="#cb18-2" aria-hidden="true" tabindex="-1"></a>  class istrstream : public basic_istream&lt;char&gt; {</span>
<span id="cb18-3"><a href="#cb18-3" aria-hidden="true" tabindex="-1"></a>  public:</span>
<span id="cb18-4"><a href="#cb18-4" aria-hidden="true" tabindex="-1"></a>    explicit istrstream(const char* s);</span>
<span id="cb18-5"><a href="#cb18-5" aria-hidden="true" tabindex="-1"></a>    explicit istrstream(char* s);</span>
<span id="cb18-6"><a href="#cb18-6" aria-hidden="true" tabindex="-1"></a>    istrstream(const char* s, streamsize n);</span>
<span id="cb18-7"><a href="#cb18-7" aria-hidden="true" tabindex="-1"></a>    istrstream(char* s, streamsize n);</span>
<span id="cb18-8"><a href="#cb18-8" aria-hidden="true" tabindex="-1"></a>    virtual ~istrstream();</span>
<span id="cb18-9"><a href="#cb18-9" aria-hidden="true" tabindex="-1"></a>   </span>
<span id="cb18-10"><a href="#cb18-10" aria-hidden="true" tabindex="-1"></a>    strstreambuf* rdbuf() const;</span>
<span id="cb18-11"><a href="#cb18-11" aria-hidden="true" tabindex="-1"></a>    char* str();</span>
<span id="cb18-12"><a href="#cb18-12" aria-hidden="true" tabindex="-1"></a>  private:</span>
<span id="cb18-13"><a href="#cb18-13" aria-hidden="true" tabindex="-1"></a>    strstreambuf sb;            <em>// exposition only</em></span>
<span id="cb18-14"><a href="#cb18-14" aria-hidden="true" tabindex="-1"></a>  };</span>
<span id="cb18-15"><a href="#cb18-15" aria-hidden="true" tabindex="-1"></a>}</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
The class <code class="sourceCode default">istrstream</code> supports
the reading of objects of class
<code class="sourceCode default">strstreambuf</code>. It supplies a
<code class="sourceCode default">strstreambuf</code> object to control
the associated array object. For the sake of exposition, the maintained
data is presented here as:</p>
<ul>
<li><code class="sourceCode default">sb</code>, the
<code class="sourceCode default">strstreambuf</code> object.</li>
</ul>
<h3 class="unnumbered" id="depr.istrstream.cons-istrstream-constructors"><span>D.14.3.2
<a href="https://wg21.link/depr.istrstream.cons">[depr.istrstream.cons]</a></span>
<code class="sourceCode default">istrstream</code> constructors<a href="#depr.istrstream.cons-istrstream-constructors" class="self-link"></a></h3>
<div class="sourceCode" id="cb19"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb19-1"><a href="#cb19-1" aria-hidden="true" tabindex="-1"></a>explicit istrstream(const char* s);</span>
<span id="cb19-2"><a href="#cb19-2" aria-hidden="true" tabindex="-1"></a>explicit istrstream(char* s);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em>Effects:</em> Initializes the base class with
<code class="sourceCode default">istream(&amp;sb)</code> and
<code class="sourceCode default">sb</code> with
<code class="sourceCode default">strstreambuf(s, 0)</code>.
<code class="sourceCode default">s</code> shall designate the first
element of an NTBS.</p>
<div class="sourceCode" id="cb20"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb20-1"><a href="#cb20-1" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb20-2"><a href="#cb20-2" aria-hidden="true" tabindex="-1"></a>istrstream(const char* s, streamsize n);</span>
<span id="cb20-3"><a href="#cb20-3" aria-hidden="true" tabindex="-1"></a>istrstream(char* s, streamsize n);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Effects:</em> Initializes the base class with
<code class="sourceCode default">istream(&amp;sb)</code> and
<code class="sourceCode default">sb</code> with
<code class="sourceCode default">strstreambuf(s,n)</code>.
<code class="sourceCode default">s</code> shall designate the first
element of an array whose length is
<code class="sourceCode default">n</code> elements, and
<code class="sourceCode default">n</code> shall be greater than
zero.</p>
<h3 class="unnumbered" id="depr.istrstream.members-member-functions"><span>D.14.3.3
<a href="https://wg21.link/depr.istrstream.members">[depr.istrstream.members]</a></span>
Member functions<a href="#depr.istrstream.members-member-functions" class="self-link"></a></h3>
<div class="sourceCode" id="cb21"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb21-1"><a href="#cb21-1" aria-hidden="true" tabindex="-1"></a>strstreambuf* rdbuf() const;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em>Returns:</em> <code class="sourceCode default">const_cast&lt;strstreambuf*&gt;(&amp;sb)</code>.</p>
<div class="sourceCode" id="cb22"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb22-1"><a href="#cb22-1" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb22-2"><a href="#cb22-2" aria-hidden="true" tabindex="-1"></a>char* str();</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Returns:</em>
<code class="sourceCode default">rdbuf()-&gt;str()</code>.</p>
<h3 class="unnumbered" id="depr.ostrstream-class-ostrstream"><span>D.14.4
<a href="https://wg21.link/depr.ostrstream">[depr.ostrstream]</a></span>
Class <code class="sourceCode default">ostrstream</code><a href="#depr.ostrstream-class-ostrstream" class="self-link"></a></h3>
<h3 class="unnumbered" id="depr.ostrstream.general-general"><span>D.14.4.1
<a href="https://wg21.link/depr.ostrstream.general">[depr.ostrstream.general]</a></span>
General<a href="#depr.ostrstream.general-general" class="self-link"></a></h3>
<div class="sourceCode" id="cb23"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb23-1"><a href="#cb23-1" aria-hidden="true" tabindex="-1"></a>namespace std {</span>
<span id="cb23-2"><a href="#cb23-2" aria-hidden="true" tabindex="-1"></a>  class ostrstream : public basic_ostream&lt;char&gt; {</span>
<span id="cb23-3"><a href="#cb23-3" aria-hidden="true" tabindex="-1"></a>  public:</span>
<span id="cb23-4"><a href="#cb23-4" aria-hidden="true" tabindex="-1"></a>    ostrstream();</span>
<span id="cb23-5"><a href="#cb23-5" aria-hidden="true" tabindex="-1"></a>    ostrstream(char* s, int n, ios_base::openmode mode = ios_base::out);</span>
<span id="cb23-6"><a href="#cb23-6" aria-hidden="true" tabindex="-1"></a>    virtual ~ostrstream();</span>
<span id="cb23-7"><a href="#cb23-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb23-8"><a href="#cb23-8" aria-hidden="true" tabindex="-1"></a>    strstreambuf* rdbuf() const;</span>
<span id="cb23-9"><a href="#cb23-9" aria-hidden="true" tabindex="-1"></a>    void freeze(bool freezefl = true);</span>
<span id="cb23-10"><a href="#cb23-10" aria-hidden="true" tabindex="-1"></a>    char* str();</span>
<span id="cb23-11"><a href="#cb23-11" aria-hidden="true" tabindex="-1"></a>    int pcount() const;</span>
<span id="cb23-12"><a href="#cb23-12" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb23-13"><a href="#cb23-13" aria-hidden="true" tabindex="-1"></a>  private:</span>
<span id="cb23-14"><a href="#cb23-14" aria-hidden="true" tabindex="-1"></a>    strstreambuf sb;            <em>// exposition only</em></span>
<span id="cb23-15"><a href="#cb23-15" aria-hidden="true" tabindex="-1"></a>  }; </span>
<span id="cb23-16"><a href="#cb23-16" aria-hidden="true" tabindex="-1"></a>}</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
The class <code class="sourceCode default">ostrstream</code> supports
the writing of objects of class
<code class="sourceCode default">strstreambuf</code>. It supplies a
<code class="sourceCode default">strstreambuf</code> object to control
the associated array object. For the sake of exposition, the maintained
data is presented here as:</p>
<ul>
<li><code class="sourceCode default">sb</code>, the
<code class="sourceCode default">strstreambuf</code> object.</li>
</ul>
<h3 class="unnumbered" id="depr.ostrstream.cons-ostrstream-constructors"><span>D.14.4.2
<a href="https://wg21.link/depr.ostrstream.cons">[depr.ostrstream.cons]</a></span>
ostrstream constructors<a href="#depr.ostrstream.cons-ostrstream-constructors" class="self-link"></a></h3>
<div class="sourceCode" id="cb24"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb24-1"><a href="#cb24-1" aria-hidden="true" tabindex="-1"></a>ostrstream();</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em>Effects:</em> Initializes the base class with
<code class="sourceCode default">ostream(&amp;sb)</code> and
<code class="sourceCode default">sb</code> with
<code class="sourceCode default">strstreambuf()</code>.</p>
<div class="sourceCode" id="cb25"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb25-1"><a href="#cb25-1" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb25-2"><a href="#cb25-2" aria-hidden="true" tabindex="-1"></a>ostrstream(char* s, int n, ios_base::openmode mode = ios_base::out);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Effects:</em> Initializes the base class with
<code class="sourceCode default">ostream(&amp;sb)</code>, and
<code class="sourceCode default">sb</code> with one of two
constructors:</p>
<ul>
<li>If <code class="sourceCode default">(mode &amp; app) == 0</code>,
then <code class="sourceCode default">s</code> shall designate the first
element of an array of <code class="sourceCode default">n</code>
elements. The constructor is
<code class="sourceCode default">strstreambuf(s, n, s)</code>.</li>
<li>If <code class="sourceCode default">(mode &amp; app) != 0</code>,
then <code class="sourceCode default">s</code> shall designate the first
element of an array of <code class="sourceCode default">n</code>
elements that contains an NTBS whose first element is designated by
<code class="sourceCode default">s</code>. The constructor is <code class="sourceCode default">strstreambuf(s, n, s + std::strlen(s))</code>.<a href="#fn2" class="footnote-ref" id="fnref2" role="doc-noteref"><sup>2</sup></a></li>
</ul>
<h3 class="unnumbered" id="depr.ostrstream.members-member-functions"><span>D.14.4.3
<a href="https://wg21.link/depr.ostrstream.members">[depr.ostrstream.members]</a></span>
Member functions<a href="#depr.ostrstream.members-member-functions" class="self-link"></a></h3>
<div class="sourceCode" id="cb26"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb26-1"><a href="#cb26-1" aria-hidden="true" tabindex="-1"></a>strstreambuf* rdbuf() const;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em>Returns:</em>
<code class="sourceCode default">(strstreambuf*)&amp;sb</code>.</p>
<div class="sourceCode" id="cb27"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb27-1"><a href="#cb27-1" aria-hidden="true" tabindex="-1"></a>void freeze(bool freezefl = true);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Effects:</em> Calls
<code class="sourceCode default">rdbuf()-&gt;freeze(freezefl)</code>.</p>
<div class="sourceCode" id="cb28"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb28-1"><a href="#cb28-1" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb28-2"><a href="#cb28-2" aria-hidden="true" tabindex="-1"></a>char* str();</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">3</a></span>
<em>Returns:</em>
<code class="sourceCode default">rdbuf()-&gt;str()</code>.</p>
<div class="sourceCode" id="cb29"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb29-1"><a href="#cb29-1" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb29-2"><a href="#cb29-2" aria-hidden="true" tabindex="-1"></a>int pcount() const;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">4</a></span>
<em>Returns:</em>
<code class="sourceCode default">rdbuf()-&gt;pcount()</code>.</p>
<h3 class="unnumbered" id="depr.strstream-class-strstream"><span>D.14.5
<a href="https://wg21.link/depr.strstream">[depr.strstream]</a></span>
Class <code class="sourceCode default">strstream</code><a href="#depr.strstream-class-strstream" class="self-link"></a></h3>
<h3 class="unnumbered" id="depr.strstream.general-general"><span>D.14.5.1
<a href="https://wg21.link/depr.strstream.general">[depr.strstream.general]</a></span>
General<a href="#depr.strstream.general-general" class="self-link"></a></h3>
<div class="sourceCode" id="cb30"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb30-1"><a href="#cb30-1" aria-hidden="true" tabindex="-1"></a>namespace std {</span>
<span id="cb30-2"><a href="#cb30-2" aria-hidden="true" tabindex="-1"></a>  class strstream</span>
<span id="cb30-3"><a href="#cb30-3" aria-hidden="true" tabindex="-1"></a>    : public basic_iostream&lt;char&gt; {</span>
<span id="cb30-4"><a href="#cb30-4" aria-hidden="true" tabindex="-1"></a>  public:</span>
<span id="cb30-5"><a href="#cb30-5" aria-hidden="true" tabindex="-1"></a>    <em>// types</em></span>
<span id="cb30-6"><a href="#cb30-6" aria-hidden="true" tabindex="-1"></a>    using char_type = char;</span>
<span id="cb30-7"><a href="#cb30-7" aria-hidden="true" tabindex="-1"></a>    using int_type  = char_traits&lt;char&gt;::int_type;</span>
<span id="cb30-8"><a href="#cb30-8" aria-hidden="true" tabindex="-1"></a>    using pos_type  = char_traits&lt;char&gt;::pos_type;</span>
<span id="cb30-9"><a href="#cb30-9" aria-hidden="true" tabindex="-1"></a>    using off_type  = char_traits&lt;char&gt;::off_type;</span>
<span id="cb30-10"><a href="#cb30-10" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb30-11"><a href="#cb30-11" aria-hidden="true" tabindex="-1"></a>    <em>// constructors/destructor</em></span>
<span id="cb30-12"><a href="#cb30-12" aria-hidden="true" tabindex="-1"></a>    strstream();</span>
<span id="cb30-13"><a href="#cb30-13" aria-hidden="true" tabindex="-1"></a>    strstream(char* s, int n,</span>
<span id="cb30-14"><a href="#cb30-14" aria-hidden="true" tabindex="-1"></a>              ios_base::openmode mode = ios_base::in|ios_base::out);</span>
<span id="cb30-15"><a href="#cb30-15" aria-hidden="true" tabindex="-1"></a>    virtual ~strstream();</span>
<span id="cb30-16"><a href="#cb30-16" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb30-17"><a href="#cb30-17" aria-hidden="true" tabindex="-1"></a>    <em>// members</em></span>
<span id="cb30-18"><a href="#cb30-18" aria-hidden="true" tabindex="-1"></a>    strstreambuf* rdbuf() const;</span>
<span id="cb30-19"><a href="#cb30-19" aria-hidden="true" tabindex="-1"></a>    void freeze(bool freezefl = true);</span>
<span id="cb30-20"><a href="#cb30-20" aria-hidden="true" tabindex="-1"></a>    int pcount() const;</span>
<span id="cb30-21"><a href="#cb30-21" aria-hidden="true" tabindex="-1"></a>    char* str();</span>
<span id="cb30-22"><a href="#cb30-22" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb30-23"><a href="#cb30-23" aria-hidden="true" tabindex="-1"></a>  private:</span>
<span id="cb30-24"><a href="#cb30-24" aria-hidden="true" tabindex="-1"></a>    strstreambuf sb;            <em>// exposition only</em></span>
<span id="cb30-25"><a href="#cb30-25" aria-hidden="true" tabindex="-1"></a>  };</span>
<span id="cb30-26"><a href="#cb30-26" aria-hidden="true" tabindex="-1"></a>}</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
The class <code class="sourceCode default">strstream</code> supports
reading and writing from objects of class
<code class="sourceCode default">strstreambuf</code>. It supplies a
<code class="sourceCode default">strstreambuf</code> object to control
the associated array object. For the sake of exposition, the maintained
data is presented here as:</p>
<ul>
<li><code class="sourceCode default">sb</code>, the
<code class="sourceCode default">strstreambuf</code> object.</li>
</ul>
<h3 class="unnumbered" id="depr.strstream.cons-strstream-constructors"><span>D.14.5.2
<a href="https://wg21.link/depr.strstream.cons">[depr.strstream.cons]</a></span>
<code class="sourceCode default">strstream</code> constructors<a href="#depr.strstream.cons-strstream-constructors" class="self-link"></a></h3>
<div class="sourceCode" id="cb31"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb31-1"><a href="#cb31-1" aria-hidden="true" tabindex="-1"></a>strstream();</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em>Effects:</em> Initializes the base class with
<code class="sourceCode default">iostream(&amp;sb)</code>.</p>
<div class="sourceCode" id="cb32"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb32-1"><a href="#cb32-1" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb32-2"><a href="#cb32-2" aria-hidden="true" tabindex="-1"></a>strstream(char* s, int n,</span>
<span id="cb32-3"><a href="#cb32-3" aria-hidden="true" tabindex="-1"></a>           ios_base::openmode mode = ios_base::in|ios_base::out);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Effects:</em> Initializes the base class with
<code class="sourceCode default">iostream(&amp;sb)</code>, and
<code class="sourceCode default">sb</code> with one of the two
constructors:</p>
<ul>
<li>If <code class="sourceCode default">(mode &amp; app) == 0</code>,
then s shall designate the first element of an array of
<code class="sourceCode default">n</code> elements. The constructor is
<code class="sourceCode default">strstreambuf(s,n,s)</code>.</li>
<li>If <code class="sourceCode default">(mode &amp; app) != 0</code>,
then s shall designate the first element of an array of
<code class="sourceCode default">n</code> elements that contains an NTBS
whose first element is designated by
<code class="sourceCode default">s</code>. The constructor is <code class="sourceCode default">strstreambuf(s,n,s+ std::strlen(s))</code>.</li>
</ul>
<h3 class="unnumbered" id="depr.strstream.dest-strstream-destructor"><span>D.14.5.3
<a href="https://wg21.link/depr.strstream.dest">[depr.strstream.dest]</a></span>
<code class="sourceCode default">strstream</code> destructor<a href="#depr.strstream.dest-strstream-destructor" class="self-link"></a></h3>
<div class="sourceCode" id="cb33"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb33-1"><a href="#cb33-1" aria-hidden="true" tabindex="-1"></a>virtual ~strstream();</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em>Effects:</em> Destroys an object of class
<code class="sourceCode default">strstream</code>.</p>
<h3 class="unnumbered" id="depr.strstream.oper-strstream-operations"><span>D.14.5.4
<a href="https://wg21.link/depr.strstream.oper">[depr.strstream.oper]</a></span>
<code class="sourceCode default">strstream</code> operations<a href="#depr.strstream.oper-strstream-operations" class="self-link"></a></h3>
<div class="sourceCode" id="cb34"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb34-1"><a href="#cb34-1" aria-hidden="true" tabindex="-1"></a>strstreambuf* rdbuf() const;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em>Returns:</em> <code class="sourceCode default">const_cast&lt;strstreambuf*&gt;(&amp;sb)</code>.</p>
<div class="sourceCode" id="cb35"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb35-1"><a href="#cb35-1" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb35-2"><a href="#cb35-2" aria-hidden="true" tabindex="-1"></a>void freeze(bool freezefl = true);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Effects:</em> Calls
<code class="sourceCode default">rdbuf()-&gt;freeze(freezefl)</code>.</p>
<div class="sourceCode" id="cb36"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb36-1"><a href="#cb36-1" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb36-2"><a href="#cb36-2" aria-hidden="true" tabindex="-1"></a>char* str();</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">3</a></span>
<em>Returns:</em>
<code class="sourceCode default">rdbuf()-&gt;str()</code>.</p>
<div class="sourceCode" id="cb37"><pre class="sourceCode default default"><code class="sourceCode default"><span id="cb37-1"><a href="#cb37-1" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb37-2"><a href="#cb37-2" aria-hidden="true" tabindex="-1"></a>int pcount() const;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">4</a></span>
<em>Returns:</em>
<code class="sourceCode default">rdbuf()-&gt;pcount()</code>.</p>
</div>
<h2 data-number="7.5" id="update-cross-reference-for-stable-labels-for-c23"><span class="header-section-number">7.5</span> Update cross-reference for
stable labels for C++23<a href="#update-cross-reference-for-stable-labels-for-c23" class="self-link"></a></h2>
<h3 class="unnumbered" id="cross-references-from-iso-c-2023">Cross-references from ISO C++
2023<a href="#cross-references-from-iso-c-2023" class="self-link"></a></h3>
<p>All clause and subclause labels from ISO C++ 2023 (ISO/IEC
14882:2023, <em>Programming Languages — C++</em>) are present in this
document, with the exceptions described below.</p>
<p>container.gen.reqmts <em>see</em><br />
    container.requirements.general</p>
<p><span class="add" style="color: #006e28"><ins>depr.istrstream
<em>removed</em></ins></span><br />
<span class="add" style="color: #006e28"><ins>depr.istrstream.cons
<em>removed</em></ins></span><br />
<span class="add" style="color: #006e28"><ins>depr.istrstream.general
<em>removed</em></ins></span><br />
<span class="add" style="color: #006e28"><ins>depr.istrstream.members
<em>removed</em></ins></span><br />
<span class="add" style="color: #006e28"><ins>depr.ostrstream
<em>removed</em></ins></span><br />
<span class="add" style="color: #006e28"><ins>depr.ostrstream.cons
<em>removed</em></ins></span><br />
<span class="add" style="color: #006e28"><ins>depr.ostrstream.general
<em>removed</em></ins></span><br />
<span class="add" style="color: #006e28"><ins>depr.ostrstream.members
<em>removed</em></ins></span><br />
depr.res.on.required <em>removed</em><br />
<span class="add" style="color: #006e28"><ins>depr.str.strstreams
<em>removed</em></ins></span><br />
<span class="add" style="color: #006e28"><ins>depr.strstream
<em>removed</em></ins></span><br />
<span class="add" style="color: #006e28"><ins>depr.strstream.cons
<em>removed</em></ins></span><br />
<span class="add" style="color: #006e28"><ins>depr.strstream.dest
<em>removed</em></ins></span><br />
<span class="add" style="color: #006e28"><ins>depr.strstream.general
<em>removed</em></ins></span><br />
<span class="add" style="color: #006e28"><ins>depr.strstream.oper
<em>removed</em></ins></span><br />
<span class="add" style="color: #006e28"><ins>depr.strstream.syn
<em>removed</em></ins></span><br />
<span class="add" style="color: #006e28"><ins>depr.strstreambuf
<em>removed</em></ins></span><br />
<span class="add" style="color: #006e28"><ins>depr.strstreambuf.cons
<em>removed</em></ins></span><br />
<span class="add" style="color: #006e28"><ins>depr.strstreambuf.general
<em>removed</em></ins></span><br />
<span class="add" style="color: #006e28"><ins>depr.strstreambuf.members
<em>removed</em></ins></span><br />
<span class="add" style="color: #006e28"><ins>depr.strstreambuf.virtuals
<em>removed</em></ins></span><br />
</p>
<h2 data-number="7.6" id="resolve-open-library-issues"><span class="header-section-number">7.6</span> Resolve open library issues<a href="#resolve-open-library-issues" class="self-link"></a></h2>
<p>The following library issues should be resolved as NAD as they no
longer apply to the C++ Standard due to the removal of the feature.</p>
<ul>
<li><span class="citation" data-cites="LWG3095">[<a href="#ref-LWG3095" role="doc-biblioref">LWG3095</a>]</span>
<code class="sourceCode default">strstreambuf</code> refers to
nonexistent member of <code class="sourceCode default">fpos</code>,
<code class="sourceCode default">fpos::offset</code></li>
<li><span class="citation" data-cites="LWG3109">[<a href="#ref-LWG3109" role="doc-biblioref">LWG3109</a>]</span>
<code class="sourceCode default">strstreambuf</code> is copyable</li>
</ul>
<h1 data-number="8" id="ack"><span class="header-section-number">8</span> Acknowledgements<a href="#ack" class="self-link"></a></h1>
<p>Thanks to Michael Park for the pandoc-based framework used to
transform this document’s source from Markdown.</p>
<p>Huge thanks to Peter Sommerlad for doing all the hard work to make
removal of this tricky legacy facility possible.</p>
<h1 data-number="9" id="bibliography"><span class="header-section-number">9</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-LWG3095" class="csl-entry" role="doc-biblioentry">
[LWG3095] Billy O’Neal III. strstreambuf refers to nonexistent member of
fpos, fpos::offset. <a href="https://wg21.link/lwg3095"><div class="csl-block">https://wg21.link/lwg3095</div></a>
</div>
<div id="ref-LWG3109" class="csl-entry" role="doc-biblioentry">
[LWG3109] Jonathan Wakely. strstreambuf is copyable. <a href="https://wg21.link/lwg3109"><div class="csl-block">https://wg21.link/lwg3109</div></a>
</div>
<div id="ref-N4958" class="csl-entry" role="doc-biblioentry">
[N4958] Thomas Köppe. 2023-08-14. Working Draft, Programming Languages
-- C++. <a href="https://wg21.link/n4958"><div class="csl-block">https://wg21.link/n4958</div></a>
</div>
<div id="ref-P0408R7" class="csl-entry" role="doc-biblioentry">
[P0408R7] Peter Sommerlad. 2019-07-18. Efficient Access to
basic_stringbuf’s Buffer. <a href="https://wg21.link/p0408r7"><div class="csl-block">https://wg21.link/p0408r7</div></a>
</div>
<div id="ref-P0448R4" class="csl-entry" role="doc-biblioentry">
[P0448R4] Peter Sommerlad. 2021-03-01. A strstream replacement using
span as buffer. <a href="https://wg21.link/p0448r4"><div class="csl-block">https://wg21.link/p0448r4</div></a>
</div>
<div id="ref-P2139R2" class="csl-entry" role="doc-biblioentry">
[P2139R2] Alisdair Meredith. 2020-07-15. Reviewing Deprecated Facilities
of C++20 for C++23. <a href="https://wg21.link/p2139r2"><div class="csl-block">https://wg21.link/p2139r2</div></a>
</div>
<div id="ref-P2863R1" class="csl-entry" role="doc-biblioentry">
[P2863R1] Alisdair Meredith. 2023-08-16. Review Annex D for C++26. <a href="https://wg21.link/p2863r1"><div class="csl-block">https://wg21.link/p2863r1</div></a>
</div>
</div>
<section class="footnotes footnotes-end-of-document" role="doc-endnotes">
<hr />
<ol>
<li id="fn1" role="doc-endnote"><p>The function signature
<code class="sourceCode default">strlen(const char*)</code> is declared
in <code class="sourceCode default">&lt;cstring&gt;</code> (<span>23.5.3
<a href="https://wg21.link/cstring.syn">[cstring.syn]</a></span>). The
macro <code class="sourceCode default">INT_MAX</code> is defined in
<code class="sourceCode default">&lt;climits&gt;</code> (<span>17.3.6
<a href="https://wg21.link/climits.syn">[climits.syn]</a></span>).<a href="#fnref1" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
<li id="fn2" role="doc-endnote"><p>The function signature
<code class="sourceCode default">strlen(const char*)</code> is declared
in <code class="sourceCode default">&lt;cstring&gt;</code> (<span>23.5.3
<a href="https://wg21.link/cstring.syn">[cstring.syn]</a></span>).<a href="#fnref2" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
</ol>
</section>
</div>
</div>
</body>
</html>
