<!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-08-15" />
  <title>Undeprecate `polymorphic_allocator::destroy` For C++26</title>
  <style>
      code{white-space: pre-wrap;}
      span.smallcaps{font-variant: small-caps;}
      span.underline{text-decoration: underline;}
      div.column{display: inline-block; vertical-align: top; width: 50%;}
      div.csl-block{margin-left: 1.5em;}
      ul.task-list{list-style: none;}
      pre > code.sourceCode { white-space: pre; position: relative; }
      pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
      pre > code.sourceCode > span:empty { height: 1.2em; }
      .sourceCode { overflow: visible; }
      code.sourceCode > span { color: inherit; text-decoration: inherit; }
      div.sourceCode { margin: 1em 0; }
      pre.sourceCode { margin: 0; }
      @media screen {
      div.sourceCode { overflow: auto; }
      }
      @media print {
      pre > code.sourceCode { white-space: pre-wrap; }
      pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
      }
      pre.numberSource code
        { counter-reset: source-line 0; }
      pre.numberSource code > span
        { position: relative; left: -4em; counter-increment: source-line; }
      pre.numberSource code > span > a:first-child::before
        { content: counter(source-line);
          position: relative; left: -1em; text-align: right; vertical-align: baseline;
          border: none; display: inline-block;
          -webkit-touch-callout: none; -webkit-user-select: none;
          -khtml-user-select: none; -moz-user-select: none;
          -ms-user-select: none; user-select: none;
          padding: 0 4px; width: 4em;
          color: #aaaaaa;
        }
      pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
      div.sourceCode
        {  background-color: #f6f8fa; }
      @media screen {
      pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
      }
      code span { } /* Normal */
      code span.al { color: #ff0000; } /* Alert */
      code span.an { } /* Annotation */
      code span.at { } /* Attribute */
      code span.bn { color: #9f6807; } /* BaseN */
      code span.bu { color: #9f6807; } /* BuiltIn */
      code span.cf { color: #00607c; } /* ControlFlow */
      code span.ch { color: #9f6807; } /* Char */
      code span.cn { } /* Constant */
      code span.co { color: #008000; font-style: italic; } /* Comment */
      code span.cv { color: #008000; font-style: italic; } /* CommentVar */
      code span.do { color: #008000; } /* Documentation */
      code span.dt { color: #00607c; } /* DataType */
      code span.dv { color: #9f6807; } /* DecVal */
      code span.er { color: #ff0000; font-weight: bold; } /* Error */
      code span.ex { } /* Extension */
      code span.fl { color: #9f6807; } /* Float */
      code span.fu { } /* Function */
      code span.im { } /* Import */
      code span.in { color: #008000; } /* Information */
      code span.kw { color: #00607c; } /* Keyword */
      code span.op { color: #af1915; } /* Operator */
      code span.ot { } /* Other */
      code span.pp { color: #6f4e37; } /* Preprocessor */
      code span.re { } /* RegionMarker */
      code span.sc { color: #9f6807; } /* SpecialChar */
      code span.ss { color: #9f6807; } /* SpecialString */
      code span.st { color: #9f6807; } /* String */
      code span.va { } /* Variable */
      code span.vs { color: #9f6807; } /* VerbatimString */
      code span.wa { color: #008000; font-weight: bold; } /* Warning */
      code.diff {color: #898887}
      code.diff span.va {color: #006e28}
      code.diff span.st {color: #bf0303}
  </style>
  <style type="text/css">
body {
margin: 5em;
font-family: serif;

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

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

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

code.sourceCode > span { display: inline; }
</style>
  <link href="data:image/x-icon;base64,AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AIJEAACCRAAAgkQAAIJEAACCRAAAgkQAVoJEAN6CRADegkQAWIJEAACCRAAAgkQAAIJEAACCRAAA////AP///wCCRAAAgkQAAIJEAACCRAAsgkQAvoJEAP+CRAD/gkQA/4JEAP+CRADAgkQALoJEAACCRAAAgkQAAP///wD///8AgkQAAIJEABSCRACSgkQA/IJEAP99PQD/dzMA/3czAP99PQD/gkQA/4JEAPyCRACUgkQAFIJEAAD///8A////AHw+AFiBQwDqgkQA/4BBAP9/PxP/uZd6/9rJtf/bybX/upd7/39AFP+AQQD/gkQA/4FDAOqAQgBc////AP///wDKklv4jlEa/3o7AP+PWC//8+3o///////////////////////z7un/kFox/35AAP+GRwD/mVYA+v///wD///8A0Zpk+NmibP+0d0T/8evj///////+/fv/1sKz/9bCs//9/fr//////+/m2/+NRwL/nloA/5xYAPj///8A////ANKaZPjRmGH/5cKh////////////k149/3UwAP91MQD/lmQ//86rhv+USg3/m1YA/5hSAP+bVgD4////AP///wDSmmT4zpJY/+/bx///////8+TV/8mLT/+TVx//gkIA/5lVAP+VTAD/x6B//7aEVv/JpH7/s39J+P///wD///8A0ppk+M6SWP/u2sf///////Pj1f/Nj1T/2KFs/8mOUv+eWhD/lEsA/8aee/+0glT/x6F7/7J8Rvj///8A////ANKaZPjRmGH/48Cf///////+/v7/2qt//82PVP/OkFX/37KJ/86siv+USg7/mVQA/5hRAP+bVgD4////AP///wDSmmT40ppk/9CVXP/69O////////7+/v/x4M//8d/P//7+/f//////9u7n/6tnJf+XUgD/nFgA+P///wD///8A0ppk+NKaZP/RmWL/1qNy//r07///////////////////////+vXw/9akdP/Wnmn/y5FY/6JfFvj///8A////ANKaZFTSmmTo0ppk/9GYYv/Ql1//5cWm//Hg0P/x4ND/5cWm/9GXYP/RmGH/0ppk/9KaZOjVnmpY////AP///wDSmmQA0ppkEtKaZI7SmmT60ppk/9CWX//OkVb/zpFW/9CWX//SmmT/0ppk/NKaZJDSmmQS0ppkAP///wD///8A0ppkANKaZADSmmQA0ppkKtKaZLrSmmT/0ppk/9KaZP/SmmT/0ppkvNKaZCrSmmQA0ppkANKaZAD///8A////ANKaZADSmmQA0ppkANKaZADSmmQA0ppkUtKaZNzSmmTc0ppkVNKaZADSmmQA0ppkANKaZADSmmQA////AP5/AAD4HwAA4AcAAMADAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAMADAADgBwAA+B8AAP5/AAAoAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wCCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAAyCRACMgkQA6oJEAOqCRACQgkQAEIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAA////AP///wD///8A////AIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRABigkQA5oJEAP+CRAD/gkQA/4JEAP+CRADqgkQAZoJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAAD///8A////AP///wD///8AgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAA4gkQAwoJEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQAxIJEADyCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAP///wD///8A////AP///wCCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAWgkQAmIJEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAJyCRAAYgkQAAIJEAACCRAAAgkQAAIJEAACCRAAA////AP///wD///8A////AIJEAACCRAAAgkQAAIJEAACCRAAAgkQAdIJEAPCCRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAPSCRAB4gkQAAIJEAACCRAAAgkQAAIJEAAD///8A////AP///wD///8AgkQAAIJEAACCRAAAgkQASoJEANKCRAD/gkQA/4JEAP+CRAD/g0YA/39AAP9zLgD/bSQA/2shAP9rIQD/bSQA/3MuAP9/PwD/g0YA/4JEAP+CRAD/gkQA/4JEAP+CRADUgkQAToJEAACCRAAAgkQAAP///wD///8A////AP///wB+PwAAgkUAIoJEAKiCRAD/gkQA/4JEAP+CRAD/hEcA/4BBAP9sIwD/dTAA/5RfKv+viF7/vp56/76ee/+wiF7/lWAr/3YxAP9sIwD/f0AA/4RHAP+CRAD/gkQA/4JEAP+CRAD/gkQArIJEACaBQwAA////AP///wD///8A////AIBCAEBzNAD6f0EA/4NFAP+CRAD/gkQA/4VIAP92MwD/bSUA/6N1Tv/ezsL/////////////////////////////////38/D/6V3Uv9uJgD/dTEA/4VJAP+CRAD/gkQA/4JEAP+BQwD/fUAA/4FDAEj///8A////AP///wD///8AzJRd5qBlKf91NgD/dDUA/4JEAP+FSQD/cy4A/3YyAP/PuKP//////////////////////////////////////////////////////9K7qP94NQD/ciwA/4VJAP+CRAD/fkEA/35BAP+LSwD/mlYA6v///wD///8A////AP///wDdpnL/4qx3/8KJUv+PUhf/cTMA/3AsAP90LgD/4dK+/////////////////////////////////////////////////////////////////+TYxf91MAD/dTIA/31CAP+GRwD/llQA/6FcAP+gWwD8////AP///wD///8A////ANGZY/LSm2X/4ap3/92mcP+wdT3/byQA/8mwj////////////////////////////////////////////////////////////////////////////+LYxv9zLgP/jUoA/59bAP+hXAD/nFgA/5xYAPL///8A////AP///wD///8A0ppk8tKaZP/RmWL/1p9q/9ubXv/XqXj////////////////////////////7+fD/vZyG/6BxS/+gcUr/vJuE//r37f//////////////////////3MOr/5dQBf+dVQD/nVkA/5xYAP+cWAD/nFgA8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/SmWP/yohJ//jo2P//////////////////////4NTG/4JDFf9lGAD/bSQA/20kAP9kGAD/fz8S/+Xb0f//////5NG9/6txN/+LOgD/m1QA/51aAP+cWAD/m1cA/5xYAP+cWADy////AP///wD///8A////ANKaZPLSmmT/0ppk/8+TWf/Unmv//v37//////////////////////+TWRr/VwsA/35AAP+ERgD/g0UA/4JGAP9lHgD/kFga/8KXX/+TRwD/jT4A/49CAP+VTQD/n10A/5xYAP+OQQD/lk4A/55cAPL///8A////AP///wD///8A0ppk8tKaZP/SmmT/y4tO/92yiP//////////////////////8NnE/8eCQP+rcTT/ez0A/3IyAP98PgD/gEMA/5FSAP+USwD/jj8A/5lUAP+JNwD/yqV2/694Mf+HNQD/jkAA/82rf/+laBj/jT4A8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/LiUr/4byY///////////////////////gupX/0I5P/+Wuev/Lklz/l1sj/308AP+QSwD/ol0A/59aAP+aVQD/k0oA/8yoh///////+fXv/6pwO//Lp3v///////Pr4f+oay7y////AP///wD///8A////ANKaZPLSmmT/0ppk/8uJSv/hvJj//////////////////////+G7l//Jhkb/0ppk/96nc//fqXX/x4xO/6dkFP+QSQD/llEA/5xXAP+USgD/yaOA///////38uv/qG05/8ijdv//////8efb/6ZpLPL///8A////AP///wD///8A0ppk8tKaZP/SmmT/zIxO/9yxh///////////////////////7dbA/8iEQf/Sm2X/0Zlj/9ScZv/eqHf/2KJv/7yAQf+XTgD/iToA/5lSAP+JNgD/yKFv/611LP+HNQD/jT8A/8qmeP+kZRT/jT4A8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/Pk1n/1J5q//78+//////////////////+/fv/1aFv/8iEQv/Tm2b/0ppl/9GZY//Wn2z/1pZc/9eldf/Bl2b/kUcA/4w9AP+OQAD/lUwA/59eAP+cWQD/jT8A/5ZOAP+eXADy////AP///wD///8A////ANKaZPLSmmT/0ppk/9KZY//KiEn/8d/P///////////////////////47+f/05tm/8iCP//KiEj/yohJ/8eCP//RmGH//vfy///////n1sP/rXQ7/4k4AP+TTAD/nVoA/5xYAP+cVwD/nFgA/5xYAPL///8A////AP///wD///8A0ppk8tKaZP/SmmT/0ptl/8uLTf/aq37////////////////////////////+/fz/6c2y/961jv/etY7/6Myx//78+v//////////////////////3MWv/5xXD/+ORAD/mFQA/51ZAP+cWAD/nFgA8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/SmmT/0ppk/8mFRP/s1b//////////////////////////////////////////////////////////////////////////////+PD/0JFU/7NzMv+WUQD/kUsA/5tXAP+dWQDy////AP///wD///8A////ANKaZP/SmmT/0ppk/9KaZP/Sm2X/z5NZ/8yMT//z5NX/////////////////////////////////////////////////////////////////9Ofa/8yNUP/UmGH/36p5/8yTWv+qaSD/kksA/5ROAPz///8A////AP///wD///8A0ppk5NKaZP/SmmT/0ppk/9KaZP/TnGf/zY9T/82OUv/t1sD//////////////////////////////////////////////////////+7Yw//OkFX/zI5R/9OcZ//SmmP/26V0/9ymdf/BhUf/ol8R6P///wD///8A////AP///wDSmmQ80ppk9tKaZP/SmmT/0ppk/9KaZP/TnGj/zpFW/8qJSv/dson/8uHS//////////////////////////////////Lj0//etIv/y4lL/86QVf/TnGj/0ppk/9KaZP/RmWP/05xn/9ymdfjUnWdC////AP///wD///8A////ANKaZADSmmQc0ppkotKaZP/SmmT/0ppk/9KaZP/Tm2b/0Zli/8qJSf/NjlH/16Z3/+G8mP/myKr/5siq/+G8mP/Xp3f/zY5S/8qISf/RmGH/05tm/9KaZP/SmmT/0ppk/9KaZP/SmmSm0pljINWdaQD///8A////AP///wD///8A0ppkANKaZADSmmQA0ppkQtKaZMrSmmT/0ppk/9KaZP/SmmT/0ptl/9GYYf/Nj1P/y4lL/8qISP/KiEj/y4lK/82PU//RmGH/0ptl/9KaZP/SmmT/0ppk/9KaZP/SmmTO0ppkRtKaZADSmmQA0ppkAP///wD///8A////AP///wDSmmQA0ppkANKaZADSmmQA0ppkANKaZGzSmmTu0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmTw0ppkcNKaZADSmmQA0ppkANKaZADSmmQA////AP///wD///8A////ANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZBLSmmSQ0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppklNKaZBTSmmQA0ppkANKaZADSmmQA0ppkANKaZAD///8A////AP///wD///8A0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQy0ppkutKaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppkvtKaZDbSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkAP///wD///8A////AP///wDSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkXNKaZODSmmT/0ppk/9KaZP/SmmT/0ppk5NKaZGDSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA////AP///wD///8A////ANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkBtKaZIbSmmTo0ppk6tKaZIrSmmQK0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZAD///8A////AP/8P///+B///+AH//+AAf//AAD//AAAP/AAAA/gAAAHwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA+AAAAfwAAAP/AAAP/8AAP//gAH//+AH///4H////D//" rel="icon" />
  
  <!--[if lt IE 9]>
    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
  <![endif]-->
</head>
<body>
<div class="wrapper">
<header id="title-block-header">
<h1 class="title" style="text-align:center">Undeprecate
<code class="sourceCode default">polymorphic_allocator::destroy</code>
For C++26</h1>
<table style="border:none;float:right">
  <tr>
    <td>Document #:</td>
    <td>P2875R1</td>
  </tr>
  <tr>
    <td>Date:</td>
    <td>2023-08-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="#r0-august-2023-mid-term-mailing" id="toc-r0-august-2023-mid-term-mailing"><span class="toc-section-number">2.1</span> R0: August 2023 (mid-term
mailing)<span></span></a></li>
<li><a href="#r0-may-2023-pre-varna" id="toc-r0-may-2023-pre-varna"><span class="toc-section-number">2.2</span> R0: May 2023
(pre-Varna)<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="#issue-history" id="toc-issue-history"><span class="toc-section-number">4</span> Issue History<span></span></a>
<ul>
<li><a href="#lwg-poll-2019-kona-meeting" id="toc-lwg-poll-2019-kona-meeting"><span class="toc-section-number">4.1</span> LWG Poll, 2019 Kona
meeting<span></span></a></li>
<li><a href="#reflector-poll" id="toc-reflector-poll"><span class="toc-section-number">4.2</span> 2020-10-11 Reflector
poll<span></span></a></li>
<li><a href="#november-2023-virtual-plenary" id="toc-november-2023-virtual-plenary"><span class="toc-section-number">4.3</span> November 2023 Virtual
Plenary<span></span></a></li>
</ul></li>
<li><a href="#analysis" id="toc-analysis"><span class="toc-section-number">5</span> Analysis<span></span></a>
<ul>
<li><a href="#asys.symmetry" id="toc-asys.symmetry"><span class="toc-section-number">5.1</span> Symmetry<span></span></a></li>
<li><a href="#asys.generic" id="toc-asys.generic"><span class="toc-section-number">5.2</span> Non-generic
use<span></span></a></li>
<li><a href="#asys.deprecated" id="toc-asys.deprecated"><span class="toc-section-number">5.3</span> Inability to use
<code class="sourceCode default">[[deprecated]]</code><span></span></a></li>
<li><a href="#asys.removal" id="toc-asys.removal"><span class="toc-section-number">5.4</span> Removal does not serve the
standard<span></span></a></li>
</ul></li>
<li><a href="#wording" id="toc-wording"><span class="toc-section-number">6</span> Proposed
wording<span></span></a></li>
<li><a href="#ack" id="toc-ack"><span class="toc-section-number">7</span>
Acknowledgements<span></span></a></li>
<li><a href="#bibliography" id="toc-bibliography"><span class="toc-section-number">8</span> References<span></span></a></li>
</ul>
</div>
<!-- Prefer rendering as html than pdf until solved table formatting issues -->
<h1 data-number="1" id="abstract"><span class="header-section-number">1</span> Abstract<a href="#abstract" class="self-link"></a></h1>
<p>The member function
<code class="sourceCode default">polymorphic_allocator::destroy</code>
was deprecated by C++23 as it defines the same semantics that would be
synthesized automatically by
<code class="sourceCode default">std::allocator_traits</code>. However,
some common use cases for
<code class="sourceCode default">std::pmr::polymorphic_allocator</code>
do not involve generic code and thus do not necessarily use
<code class="sourceCode default">std::allocator_traits</code> to call on
the services of such allocators. This paper recommends undeprecating
that function and restoring its wording to the main Standard clause.</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 data-number="2.1" id="r0-august-2023-mid-term-mailing"><span class="header-section-number">2.1</span> R0: August 2023 (mid-term
mailing)<a href="#r0-august-2023-mid-term-mailing" class="self-link"></a></h2>
<ul>
<li>Confirmed wording for latest working draft, <span class="citation" data-cites="N4950">[<a href="#ref-N4950" role="doc-biblioref">N4950</a>]</span></li>
<li>Removed syntax highlighting from standardese to avoid markup
conflicts</li>
<li>Removed use of
<code class="sourceCode default">allocator_traits</code> in
<code class="sourceCode default">delete_object</code></li>
<li>Improved rationale following initial reflector review — thanks
Pablo!</li>
</ul>
<h2 data-number="2.2" id="r0-may-2023-pre-varna"><span class="header-section-number">2.2</span> R0: May 2023 (pre-Varna)<a href="#r0-may-2023-pre-varna" class="self-link"></a></h2>
<p>Initial draft of this paper.</p>
<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="P2863R0">[<a href="#ref-P2863R0" role="doc-biblioref">P2863R0</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 member function <code class="sourceCode default">std::polymorphic_allocator::destroy</code>,
<span>D.18
<a href="https://wg21.link/depr.mem.poly.allocator.mem">[depr.mem.poly.allocator.mem]</a></span>.</p>
<h1 data-number="4" id="issue-history"><span class="header-section-number">4</span> Issue History<a href="#issue-history" class="self-link"></a></h1>
<p>This feature was deprecated by <span class="citation" data-cites="LWG3036">[<a href="#ref-LWG3036" role="doc-biblioref">LWG3036</a>]</span>.</p>
<h2 data-number="4.1" id="lwg-poll-2019-kona-meeting"><span class="header-section-number">4.1</span> LWG Poll, 2019 Kona meeting<a href="#lwg-poll-2019-kona-meeting" class="self-link"></a></h2>
<p>Are we in favor of deprecation, pending on paper <span class="citation" data-cites="P0339R6">[<a href="#ref-P0339R6" role="doc-biblioref">P0339R6</a>]</span></p>
<!-- Note that this table renders badly in pdf, may prefer a html rendering -->
<table>
<thead>
<tr class="header">
<th style="text-align: center;"><div style="text-align:center">
<strong>F</strong>
</div></th>
<th style="text-align: center;"><div style="text-align:center">
<strong>N</strong>
</div></th>
<th style="text-align: center;"><div style="text-align:center">
<strong>A</strong>
</div></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: center;">5</td>
<td style="text-align: center;">3</td>
<td style="text-align: center;">2</td>
</tr>
</tbody>
</table>
<!--
: Are we in favor of deprecation, pending on paper [@P0339R6]
NOTE THAT THE CAPTION IS PREFERRED WHEN RENDERING AS PDF
  -->
<h2 data-number="4.2" id="reflector-poll"><span class="header-section-number">4.2</span> 2020-10-11 Reflector poll<a href="#reflector-poll" class="self-link"></a></h2>
<p>Moved to Tentatively Ready after seven votes in favour.</p>
<h2 data-number="4.3" id="november-2023-virtual-plenary"><span class="header-section-number">4.3</span> November 2023 Virtual Plenary<a href="#november-2023-virtual-plenary" class="self-link"></a></h2>
<p>Adopted for C++23 by omnibus issues paper <span class="citation" data-cites="P2236R0">[<a href="#ref-P2236R0" role="doc-biblioref">P2236R0</a>]</span>.</p>
<h1 data-number="5" id="analysis"><span class="header-section-number">5</span> Analysis<a href="#analysis" class="self-link"></a></h1>
<p><code class="sourceCode default">std::pmr::polymorphic_allocator</code>
is an allocator that will often be used in non-generic circumstances,
unlike <code class="sourceCode default">std::allocator</code>. This
member function that could otherwise be synthesized by
<code class="sourceCode default">std::allocator_traits</code> should
still be part of its pubic interface for direct use.</p>
<p>Hence, this paper recommends undeprecating the
<code class="sourceCode default">destroy</code> member function, as the
natural and expected analog paired with
<code class="sourceCode default">construct</code>.</p>
<h2 data-number="5.1" id="asys.symmetry"><span class="header-section-number">5.1</span> Symmetry<a href="#asys.symmetry" class="self-link"></a></h2>
<p><code class="sourceCode default">polymorphic_allocator</code> has
<code class="sourceCode default">construct</code>, so logically it
should also have <code class="sourceCode default">destroy</code>. If I
see a class that overrides <code class="sourceCode default">new</code>
but does not override <code class="sourceCode default">delete</code>, I
get suspicious, at best, and disgusted at worst. If I write code that
uses <code class="sourceCode default">construct</code>, I will probably
also want to call <code class="sourceCode default">destroy</code>, even
if I know that it is a no-op or can be expressed another way.</p>
<h2 data-number="5.2" id="asys.generic"><span class="header-section-number">5.2</span> Non-generic use<a href="#asys.generic" class="self-link"></a></h2>
<p>Code that does not use an allocator template (e.g.,
<code class="sourceCode default">experimental::function</code> from the
LFTS), can use
<code class="sourceCode default">polymorphic_allocator</code> to avoid
type erasure. Such code would not need to use the
<code class="sourceCode default">allocator_traits</code> indirection and
would call <code class="sourceCode default">allocate</code>,
<code class="sourceCode default">construct</code>,
<code class="sourceCode default">destroy</code>, and
<code class="sourceCode default">deallocate</code> directly. Yes, it
could use <code class="sourceCode default">destroy_at</code> directly,
but that breaks abstraction and symmetry (<a href="#asys.symmetry">see
above</a>). Any such existing code would need to change if
<code class="sourceCode default">destroy</code> is removed.</p>
<h2 data-number="5.3" id="asys.deprecated"><span class="header-section-number">5.3</span> Inability to use
<code class="sourceCode default">[[deprecated]]</code><a href="#asys.deprecated" class="self-link"></a></h2>
<p>If one of the goals is to not write something that
<code class="sourceCode default">allocator_traits</code> already does
for you, then <code class="sourceCode default">allocator_traits</code>
needs to detect the presence or absence of member-function
<code class="sourceCode default">destroy</code>. That detection will
invariably cause a deprecation warning if
<code class="sourceCode default">destroy</code> is annotated as
<code class="sourceCode default">[[deprecated]]</code>. Therefore, when
the <code class="sourceCode default">destroy</code> method is eventually
remove, unsuspecting code breakage will occur.</p>
<p>NOTE: it has since been reported that the deprecation warning can be
turned off in a platform-specific way using pragmas within
<code class="sourceCode default">allocator_traits</code>. Alternatively,
<code class="sourceCode default">allocator_traits</code> can be
specialized for
<code class="sourceCode default">polymorphic_allocator</code> to avoid
calling the deprecated member function.</p>
<h2 data-number="5.4" id="asys.removal"><span class="header-section-number">5.4</span> Removal does not serve the
standard<a href="#asys.removal" class="self-link"></a></h2>
<p>The deprecation and removal of
<code class="sourceCode default">destroy</code> has very little benefit
to the standard — certainly not enough to justify breaking code (see <a href="#asys.generic">usage</a> above).</p>
<h1 data-number="6" id="wording"><span class="header-section-number">6</span> Proposed wording<a href="#wording" class="self-link"></a></h1>
<p>All changes are relative to <span class="citation" data-cites="N4950">[<a href="#ref-N4950" role="doc-biblioref">N4950</a>]</span>.</p>
<p><strong><span>20.4.3.1
<a href="https://wg21.link/mem.poly.allocator.class.general">[mem.poly.allocator.class.general]</a></span>
General</strong></p>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
A specialization of class template
<code class="sourceCode default">pmr::polymorphic_allocator</code> meets
the allocator completeness requirements (<span>16.4.4.6.2
<a href="https://wg21.link/allocator.requirements.completeness">[allocator.requirements.completeness]</a></span>)
if its template argument is a <em>cv</em>-unqualified object type.</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a>namespace std::pmr {</span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a>  template&lt;class Tp = byte&gt; class polymorphic_allocator {</span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a>    memory_resource* memory_rsrc;       <em>// exposition only</em></span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a>  public:</span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a>    using value_type = Tp;</span>
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a>    // <span>20.4.3.2
<a href="https://wg21.link/mem.poly.allocator.ctor">[mem.poly.allocator.ctor]</a></span>, constructors</span>
<span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a>    polymorphic_allocator() noexcept;</span>
<span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a>    polymorphic_allocator(memory_resource* r);</span>
<span id="cb1-11"><a href="#cb1-11" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-12"><a href="#cb1-12" aria-hidden="true" tabindex="-1"></a>    polymorphic_allocator(const polymorphic_allocator&amp; other) = default;</span>
<span id="cb1-13"><a href="#cb1-13" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-14"><a href="#cb1-14" aria-hidden="true" tabindex="-1"></a>    template&lt;class U&gt;</span>
<span id="cb1-15"><a href="#cb1-15" aria-hidden="true" tabindex="-1"></a>      polymorphic_allocator(const polymorphic_allocator&lt;U&gt;&amp; other) noexcept;</span>
<span id="cb1-16"><a href="#cb1-16" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-17"><a href="#cb1-17" aria-hidden="true" tabindex="-1"></a>    polymorphic_allocator&amp; operator=(const polymorphic_allocator&amp;) = delete;</span>
<span id="cb1-18"><a href="#cb1-18" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-19"><a href="#cb1-19" aria-hidden="true" tabindex="-1"></a>    // <span>20.4.3.3
<a href="https://wg21.link/mem.poly.allocator.mem">[mem.poly.allocator.mem]</a></span>, member functions</span>
<span id="cb1-20"><a href="#cb1-20" aria-hidden="true" tabindex="-1"></a>    [[nodiscard]] Tp* allocate(size_t n);</span>
<span id="cb1-21"><a href="#cb1-21" aria-hidden="true" tabindex="-1"></a>    void deallocate(Tp* p, size_t n);</span>
<span id="cb1-22"><a href="#cb1-22" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-23"><a href="#cb1-23" aria-hidden="true" tabindex="-1"></a>    [[nodiscard]] void* allocate_bytes(size_t nbytes, size_t alignment = alignof(max_align_t));</span>
<span id="cb1-24"><a href="#cb1-24" aria-hidden="true" tabindex="-1"></a>    void deallocate_bytes(void* p, size_t nbytes, size_t alignment = alignof(max_align_t));</span>
<span id="cb1-25"><a href="#cb1-25" aria-hidden="true" tabindex="-1"></a>    template&lt;class T&gt; [[nodiscard]] T* allocate_object(size_t n = 1);</span>
<span id="cb1-26"><a href="#cb1-26" aria-hidden="true" tabindex="-1"></a>    template&lt;class T&gt; void deallocate_object(T* p, size_t n = 1);</span>
<span id="cb1-27"><a href="#cb1-27" aria-hidden="true" tabindex="-1"></a>    template&lt;class T, class... CtorArgs&gt; [[nodiscard]] T* new_object(CtorArgs&amp;&amp;... ctor_args);</span>
<span id="cb1-28"><a href="#cb1-28" aria-hidden="true" tabindex="-1"></a>    template&lt;class T&gt; void delete_object(T* p);</span>
<span id="cb1-29"><a href="#cb1-29" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-30"><a href="#cb1-30" aria-hidden="true" tabindex="-1"></a>    template&lt;class T, class... Args&gt;</span>
<span id="cb1-31"><a href="#cb1-31" aria-hidden="true" tabindex="-1"></a>      void construct(T* p, Args&amp;&amp;... args);</span>
<span id="cb1-32"><a href="#cb1-32" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-33"><a href="#cb1-33" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins>template&lt;class T&gt;</ins></span></span>
<span id="cb1-34"><a href="#cb1-34" aria-hidden="true" tabindex="-1"></a>      <span class="add" style="color: #006e28"><ins>void destroy(T* p);</ins></span></span>
<span id="cb1-35"><a href="#cb1-35" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-36"><a href="#cb1-36" aria-hidden="true" tabindex="-1"></a>    polymorphic_allocator select_on_container_copy_construction() const;</span>
<span id="cb1-37"><a href="#cb1-37" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-38"><a href="#cb1-38" aria-hidden="true" tabindex="-1"></a>    memory_resource* resource() const;</span>
<span id="cb1-39"><a href="#cb1-39" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-40"><a href="#cb1-40" aria-hidden="true" tabindex="-1"></a>    // friends</span>
<span id="cb1-41"><a href="#cb1-41" aria-hidden="true" tabindex="-1"></a>    friend bool operator==(const polymorphic_allocator&amp; a,</span>
<span id="cb1-42"><a href="#cb1-42" aria-hidden="true" tabindex="-1"></a>                           const polymorphic_allocator&amp; b) noexcept {</span>
<span id="cb1-43"><a href="#cb1-43" aria-hidden="true" tabindex="-1"></a>      return *a.resource() == *b.resource();</span>
<span id="cb1-44"><a href="#cb1-44" aria-hidden="true" tabindex="-1"></a>    }</span>
<span id="cb1-45"><a href="#cb1-45" aria-hidden="true" tabindex="-1"></a>  };</span>
<span id="cb1-46"><a href="#cb1-46" aria-hidden="true" tabindex="-1"></a>}</span></code></pre></div>
<p><strong><span>20.4.3.3
<a href="https://wg21.link/mem.poly.allocator.mem">[mem.poly.allocator.mem]</a></span>
Member functions</strong></p>
<div class="sourceCode" id="cb2"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a>template&lt;class T&gt;</span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a>  void delete_object(T* p);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">13</a></span>
<em>Effects:</em> Equivalent to:</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="rm" style="color: #bf0303"><del>allocator_traits&lt;polymorphic_allocator&gt;::</del></span>destroy(<span class="rm" style="color: #bf0303"><del>*this,</del></span> p);</span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a>deallocate_object(p);</span></code></pre></div>
<div class="sourceCode" id="cb4"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a>template&lt;class T, class... Args&gt;</span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a>  void construct(T* p, Args&amp;&amp;... args);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">14</a></span>
<em>Mandates:</em> Uses-allocator construction of
<code class="sourceCode default">T</code> with allocator
<code class="sourceCode default">*this</code> (see <span>20.2.8.2
<a href="https://wg21.link/allocator.uses.construction">[allocator.uses.construction]</a></span>)
and constructor arguments <code class="sourceCode default">std::forward&lt;Args&gt;(args)...</code> is
well-formed.</p>
<p><span class="marginalizedparent"><a class="marginalized">15</a></span>
<em>Effects:</em> Construct a <code class="sourceCode default">T</code>
object in the storage whose address is represented by
<code class="sourceCode default">p</code> by uses-allocator construction
with allocator <code class="sourceCode default">*this</code> and
constructor arguments <code class="sourceCode default">std::forward&lt;Args&gt;(args)....</code></p>
<p><span class="marginalizedparent"><a class="marginalized">16</a></span>
<em>Throws:</em> Nothing unless the constructor for
<code class="sourceCode default">T</code> throws.</p>
<div class="add" style="color: #006e28">

<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>template&lt;class T&gt;</span>
<span id="cb5-2"><a href="#cb5-2" aria-hidden="true" tabindex="-1"></a>  void destroy(T* p);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">X</a></span>
<em>Effects:</em> As if by
<code class="sourceCode default">p-&gt;~T()</code>.</p>
</div>
<div class="sourceCode" id="cb6"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a>polymorphic_allocator select_on_container_copy_construction() const;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">17</a></span>
<em>Returns:</em>
<code class="sourceCode default">polymorphic_allocator()</code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">18</a></span>
[<em>Note 4:</em> The memory resource is not propagated. —<em>end
note</em>]</p>
<div class="rm" style="color: #bf0303">
<p><strong><span>D.18
<a href="https://wg21.link/depr.mem.poly.allocator.mem">[depr.mem.poly.allocator.mem]</a></span>
Deprecated polymorphic_allocator member function</strong></p>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
The following member is declared in addition to those members specified
in <span>20.4.3.3
<a href="https://wg21.link/mem.poly.allocator.mem">[mem.poly.allocator.mem]</a></span>:</p>
<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>  namespace std::pmr {</span>
<span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a>    template&lt;class Tp = byte&gt;</span>
<span id="cb7-3"><a href="#cb7-3" aria-hidden="true" tabindex="-1"></a>    class polymorphic_allocator {</span>
<span id="cb7-4"><a href="#cb7-4" aria-hidden="true" tabindex="-1"></a>    public:</span>
<span id="cb7-5"><a href="#cb7-5" aria-hidden="true" tabindex="-1"></a>      template &lt;class T&gt;</span>
<span id="cb7-6"><a href="#cb7-6" aria-hidden="true" tabindex="-1"></a>        void destroy(T* p);</span>
<span id="cb7-7"><a href="#cb7-7" aria-hidden="true" tabindex="-1"></a>    };</span>
<span id="cb7-8"><a href="#cb7-8" aria-hidden="true" tabindex="-1"></a>  }</span></code></pre></div>
<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>template&lt;class T&gt;</span>
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a>  void destroy(T* p);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Effects:</em> As if by
<code class="sourceCode default">p-&gt;~T()</code>.</p>
</div>
<h1 data-number="7" id="ack"><span class="header-section-number">7</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>Thanks to Pablo Halpern for good reviews and helping to organize the
rationale.</p>
<h1 data-number="8" id="bibliography"><span class="header-section-number">8</span> References<a href="#bibliography" class="self-link"></a></h1>
<div id="refs" class="references csl-bib-body hanging-indent" role="doc-bibliography">
<div id="ref-LWG3036" class="csl-entry" role="doc-biblioentry">
[LWG3036] Casey Carter. polymorphic_allocator::destroy is extraneous. <a href="https://wg21.link/lwg3036"><div class="csl-block">https://wg21.link/lwg3036</div></a>
</div>
<div id="ref-N4950" class="csl-entry" role="doc-biblioentry">
[N4950] Thomas Köppe. 2023-05-10. Working Draft, Standard for
Programming Language C++. <a href="https://wg21.link/n4950"><div class="csl-block">https://wg21.link/n4950</div></a>
</div>
<div id="ref-P0339R6" class="csl-entry" role="doc-biblioentry">
[P0339R6] Pablo Halpern, Dietmar Kühl. 2019-02-22.
polymorphic_allocator&lt;&gt; as a vocabulary type. <a href="https://wg21.link/p0339r6"><div class="csl-block">https://wg21.link/p0339r6</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-P2236R0" class="csl-entry" role="doc-biblioentry">
[P2236R0] Jonathan Wakely. 2020-10-15. C++ Standard Library Issues to be
moved in Virtual Plenary, Nov. 2020. <a href="https://wg21.link/p2236r0"><div class="csl-block">https://wg21.link/p2236r0</div></a>
</div>
<div id="ref-P2863R0" class="csl-entry" role="doc-biblioentry">
[P2863R0] Alisdair Meredith. 2023-05-19. Review Annex D for C++26. <a href="https://wg21.link/p2863r0"><div class="csl-block">https://wg21.link/p2863r0</div></a>
</div>
</div>
</div>
</div>
</body>
</html>
