<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
  <meta charset="utf-8" />
  <meta name="generator" content="mpark/wg21" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
  <meta name="dcterms.date" content="2025-05-19" />
  <title>Cross-capacity comparisons for inplace_vector</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">Cross-capacity comparisons
for inplace_vector</h1>
<table style="border:none;float:right">
  <tr>
    <td>Document #:</td>
    <td>
      P3698R0
      [<a href="https://wg21.link/P3698">Latest</a>]
      [<a href="https://wg21.link/P3698/status">Status</a>]
    </td>
  </tr>
  <tr>
    <td>Date:</td>
    <td>2025-05-19</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>
      LEWG<br>
    </td>
  </tr>
  <tr>
    <td style="vertical-align:top">Reply-to:</td>
    <td>
      Charles Hussong<br>&lt;<a href="mailto:charles.hussong@proton.me" class="email">charles.hussong@proton.me</a>&gt;<br>
    </td>
  </tr>
</table>
</header>
<div style="clear:both">
<h1 data-number="1" id="introduction"><span class="header-section-number">1</span> Introduction<a href="#introduction" class="self-link"></a></h1>
<p><code class="sourceCode cpp">inplace_vector</code>, which was
proposed by <span class="citation" data-cites="P0843R14"><a href="https://wg21.link/p0843r14" role="doc-biblioref">[P0843R14]</a></span> and accepted for C++26, has a
missing feature which weakens its API compared to ordinary
<code class="sourceCode cpp">vector</code>: it is not possible to
compare instances with different capacities. I believe this should be
added before its standardization is completed.</p>
<h1 data-number="2" id="the-problem"><span class="header-section-number">2</span> The problem<a href="#the-problem" class="self-link"></a></h1>
<p><span class="citation" data-cites="P0843R14"><a href="https://wg21.link/p0843r14" role="doc-biblioref">[P0843R14]</a></span> describes the API of
<code class="sourceCode cpp">inplace_vector</code> as “closely
resembl[ing] <code class="sourceCode cpp">std<span class="op">::</span>vector<span class="op">&lt;</span>T, A<span class="op">&gt;</span></code>”,
which indeed is largely the case, including its comparison operators.
Like <code class="sourceCode cpp">vector</code>,
<code class="sourceCode cpp">inplace_vector</code> has comparison
operators which look at the current contents, returning a lexicographic
ordering following the convention of <a href="https://eel.is/c++draft/container.reqmts">[container.reqmts]</a>.</p>
<p>For <code class="sourceCode cpp">vector</code>, the current capacity
is a dynamic member variable which is ignored for the purposes of
comparisons; therefore, the following code works regardless of the
internal logic for growing the capacity:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="pp">#include </span><span class="im">&lt;cassert&gt;</span></span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="pp">#include </span><span class="im">&lt;vector&gt;</span></span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a><span class="dt">int</span> main<span class="op">()</span> <span class="op">{</span></span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a>  std<span class="op">::</span>vector<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;</span> a<span class="op">{</span><span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">3</span><span class="op">}</span>;</span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a>  std<span class="op">::</span>vector<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;</span> b<span class="op">{</span><span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">3</span><span class="op">}</span>;</span>
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a>  a<span class="op">.</span>reserve<span class="op">(</span><span class="dv">10</span><span class="op">)</span>;</span>
<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a>  b<span class="op">.</span>reserve<span class="op">(</span><span class="dv">100</span><span class="op">)</span>;</span>
<span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a>  <span class="ot">assert</span><span class="op">(</span>a <span class="op">==</span> b<span class="op">)</span>;</span>
<span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p>However, for <code class="sourceCode cpp">inplace_vector</code>, the
capacity is a static part of the type itself and the comparison operator
is defaulted, so the equivalent code does not work:</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="pp">#include </span><span class="im">&lt;cassert&gt;</span></span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="pp">#include </span><span class="im">&lt;inplace_vector&gt;</span></span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a><span class="dt">int</span> main<span class="op">()</span> <span class="op">{</span></span>
<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a>  std<span class="op">::</span>inplace_vector<span class="op">&lt;</span><span class="dt">int</span>, <span class="dv">10</span><span class="op">&gt;</span> x<span class="op">{</span><span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">3</span><span class="op">}</span>;</span>
<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a>  std<span class="op">::</span>inplace_vector<span class="op">&lt;</span><span class="dt">int</span>, <span class="dv">100</span><span class="op">&gt;</span> y<span class="op">{</span><span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">3</span><span class="op">}</span>;</span>
<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a>  <span class="ot">assert</span><span class="op">(</span>x <span class="op">==</span> y<span class="op">)</span>;  <span class="co">// compilation error: decltype(x) not comparable with decltype(y)</span></span>
<span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p>The two vectors with different capacities are distinct types, so the
defaulted comparison operator does not support a mixture of them.</p>
<p>This discrepancy with <code class="sourceCode cpp">vector</code> does
not appear in the “Summary of semantic differences with
<code class="sourceCode cpp">vector</code>” section of <span class="citation" data-cites="P0843R14"><a href="https://wg21.link/p0843r14" role="doc-biblioref">[P0843R14]</a></span>, leading one to surmise that
the intention was for both types to have the same comparison semantics.
Private conversations with the <span class="citation" data-cites="P0843R14"><a href="https://wg21.link/p0843r14" role="doc-biblioref">[P0843R14]</a></span> authors confirm that they
intended for cross-capacity comparisons to work.</p>
<h1 data-number="3" id="existing-practice"><span class="header-section-number">3</span> Existing practice<a href="#existing-practice" class="self-link"></a></h1>
<p>The original proposal <span class="citation" data-cites="P0843R14"><a href="https://wg21.link/p0843r14" role="doc-biblioref">[P0843R14]</a></span> cites three library
implementations: Boost.Container <span class="citation" data-cites="Boost"><a href="http://www.boost.org/doc/libs/1_59_0/doc/html/boost/container/static_vector.html" role="doc-biblioref">[1]</a></span>, EASTL <span class="citation" data-cites="Eastl"><a href="https://github.com/questor/eastl/blob/master/fixed_vector.h#L71" role="doc-biblioref">[2]</a></span>, and Folly <span class="citation" data-cites="Folly"><a href="https://github.com/facebook/folly/blob/main/folly/docs/small_vector.md" role="doc-biblioref">[3]</a></span>. This paper was prompted by a user
question related to an analogous class in ETL <span class="citation" data-cites="Etl"><a href="https://www.etlcpp.com/vector.html" role="doc-biblioref">[4]</a></span>, so I have included it as well.</p>
<p>Of these,</p>
<ul>
<li>Boost claims in its documentation to define the comparisons as free
functions templated separately on both capacities <span class="citation" data-cites="BoostDoc"><a href="https://www.boost.org/doc/libs/1_59_0/doc/html/boost_container_header_reference.html#header.boost.container.static_vector_hpp" role="doc-biblioref">[5]</a></span>, however the actual implementation
defines the comparisons as non-templated friend functions of a base
class which is templated on the capacity <span class="citation" data-cites="BoostImpl"><a href="https://www.boost.org/doc/libs/1_59_0/boost/container/vector.hpp" role="doc-biblioref">[6]</a></span></li>
<li>EASTL defines the comparisons as free functions taking references to
an allocator-aware base class, and the template uses the same allocator
(thus capacity) for both sides <span class="citation" data-cites="EastlImpl"><a href="https://github.com/questor/eastl/blob/624c573fefbd5e9382e726a42590cd8dc9f03916/vector.h#L1999-L2045" role="doc-biblioref">[7]</a></span></li>
<li>Folly defines the comparisons as non-templated member functions
<span class="citation" data-cites="FollyImpl"><a href="https://github.com/facebook/folly/blob/d17bf897cb5bbf8f07b122a614e8cffdc38edcde/folly/container/small_vector.h#L644-L659" role="doc-biblioref">[8]</a></span></li>
<li>ETL defines the comparisons in a capacity-erased base class, which
is inherited by <code class="sourceCode cpp">vector</code>s of all
capacities <span class="citation" data-cites="EtlImpl"><a href="https://github.com/ETLCPP/etl/blob/a12dbbd91174e895bdd5492826b0226b9668fc5f/include/etl/vector.h#L1115-L1192" role="doc-biblioref">[9]</a></span></li>
</ul>
<p>Therefore of the prior art, mixed-capacity comparisons work in ETL,
do not work in EASTL and Folly, and Boost claims they work but in fact
they do not.</p>
<h1 data-number="4" id="proposed-solution"><span class="header-section-number">4</span> Proposed solution<a href="#proposed-solution" class="self-link"></a></h1>
<p>From the current draft wording in <span class="citation" data-cites="N5008"><a href="https://wg21.link/n5008" role="doc-biblioref">[N5008]</a></span>, modify the comparison operators
in the listing in section <a href="https://eel.is/c++draft/inplace.vector.overview">[inplace.vector.overview]</a>
to be templated on the capacity:</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">template &lt;size_t M&gt;</code></span></ins></span></span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">friend</span> <span class="dt">bool</span> <span class="kw">operator</span><span class="op">==(</span><span class="kw">const</span> inplace_vector<span class="op">&amp;</span> x, <span class="kw">const</span> inplace_vector<span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">&lt;T, M&gt;</code></span></ins></span><span class="op">&amp;</span> y<span class="op">)</span>;</span>
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">template &lt;size_t M&gt;</code></span></ins></span></span>
<span id="cb3-4"><a href="#cb3-4" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">friend</span> <em>synth-three-way-result</em><span class="op">&lt;</span>T<span class="op">&gt;</span></span>
<span id="cb3-5"><a href="#cb3-5" aria-hidden="true" tabindex="-1"></a>  <span class="kw">operator</span><span class="op">&lt;=&gt;(</span><span class="kw">const</span> inplace_vector<span class="op">&amp;</span> x, <span class="kw">const</span> inplace_vector<span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">&lt;T, M&gt;</code></span></ins></span><span class="op">&amp;</span> y<span class="op">)</span>;</span></code></pre></div>
<p>After <a href="https://eel.is/c++draft/inplace.vector.erasure">[inplace.vector.erasure]</a>,
add a new section [containers.sequences.inplace.vector.comparison] with
the following contents:</p>
<div class="add" style="color: #006e28">

<blockquote>
<div class="sourceCode" id="cb4"><pre class="sourceCode default cpp"><code class="sourceCode default"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a>template &lt;size_t M&gt;</span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a>constexpr friend bool operator==(const inplace_vector&amp; c, const inplace_vector&lt;T, M&gt;&amp; b);</span></code></pre></div>
<p><em>Effects</em>: Equivalent to
<code class="sourceCode default">c == b</code> defined in
[container.reqmts], treating
<code class="sourceCode default">inplace_vector&lt;T, N&gt;</code> and
<code class="sourceCode default">inplace_vector&lt;T, M&gt;</code> as
the same type.</p>
<hr />
<div class="sourceCode" id="cb5"><pre class="sourceCode default cpp"><code class="sourceCode default"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a>template &lt;size_t M&gt;</span>
<span id="cb5-2"><a href="#cb5-2" aria-hidden="true" tabindex="-1"></a>constexpr friend <em>synth-three-way-result</em>&lt;T&gt;</span>
<span id="cb5-3"><a href="#cb5-3" aria-hidden="true" tabindex="-1"></a>  operator&lt;=&gt;(const inplace_vector&amp; a, const inplace_vector&lt;T, M&gt;&amp; b);</span></code></pre></div>
<p><em>Effects</em>: Equivalent to
<code class="sourceCode default">a &lt;=&gt; b</code> defined in
[container.opt.reqmts], treating
<code class="sourceCode default">inplace_vector&lt;T, N&gt;</code> and
<code class="sourceCode default">inplace_vector&lt;T, M&gt;</code> as
the same type.</p>
</blockquote>

</div>
<h1 data-number="5" id="what-about-a-generic-solution-to-container-comparisons"><span class="header-section-number">5</span> What about a generic solution to
container comparisons?<a href="#what-about-a-generic-solution-to-container-comparisons" class="self-link"></a></h1>
<p>There is another paper, <span class="citation" data-cites="P0805R2"><a href="https://wg21.link/p0805r2" role="doc-biblioref">[P0805R2]</a></span>, which attempts to generically
solve the issue of comparisons between containers which are logically
comparable but are not comparable in practice because they are distinct
types. Last updated in 2018, this paper would allow comparisons between
vectors with different allocator types or arrays with different sizes,
among other things. I support this paper as well, but it is much larger
in scope and therefore would require more effort and debate to adopt.
Since <code class="sourceCode cpp">inplace_vector</code> is new for
C++26, I would like to fix its API before it’s released into the wild,
and then come back and try to merge the generic solution via an updated
<span class="citation" data-cites="P0805R2"><a href="https://wg21.link/p0805r2" role="doc-biblioref">[P0805R2]</a></span> targeting C++29.</p>
<p>The changes proposed by this paper would not conflict with those of
<span class="citation" data-cites="P0805R2"><a href="https://wg21.link/p0805r2" role="doc-biblioref">[P0805R2]</a></span>, which solves the problem
mainly by amending [sequence.reqmts] to be more generic. The API that
would be enabled by <span class="citation" data-cites="P0805R2"><a href="https://wg21.link/p0805r2" role="doc-biblioref">[P0805R2]</a></span> would be a superset of the one
proposed in this paper, and an updated <span class="citation" data-cites="P0805R2"><a href="https://wg21.link/p0805r2" role="doc-biblioref">[P0805R2]</a></span> could simply widen the
templating on the comparison operators proposed here to cover data types
as well, and delete the section
[containers.sequences.inplace.vector.comparison] which would no longer
be needed. This would not break code that works under this paper’s
wording.</p>
<h1 data-number="6" id="acknowledgements"><span class="header-section-number">6</span> Acknowledgements<a href="#acknowledgements" class="self-link"></a></h1>
<p>Thank you to Anthony Williams for help with drafting this paper and
Timur Doumler for insight into the intent behind <span class="citation" data-cites="P0843R14"><a href="https://wg21.link/p0843r14" role="doc-biblioref">[P0843R14]</a></span>.</p>
<h1 data-number="7" id="bibliography"><span class="header-section-number">7</span> References<a href="#bibliography" class="self-link"></a></h1>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="1" role="doc-bibliography">
<div id="ref-Boost" class="csl-entry" role="doc-biblioentry">
[1] Ion Gaztanaga. Boost.Container. <a href="http://www.boost.org/doc/libs/1_59_0/doc/html/boost/container/static_vector.html"><div class="csl-block">http://www.boost.org/doc/libs/1_59_0/doc/html/boost/container/static_vector.html</div></a>
</div>
<div id="ref-Eastl" class="csl-entry" role="doc-biblioentry">
[2] Electronic Arts Inc. EA Standard Template Library. <a href="https://github.com/questor/eastl/blob/master/fixed_vector.h#L71"><div class="csl-block">https://github.com/questor/eastl/blob/master/fixed_vector.h#L71</div></a>
</div>
<div id="ref-Folly" class="csl-entry" role="doc-biblioentry">
[3] Meta Platforms, Inc. Folly: Facebook Open-source Library. <a href="https://github.com/facebook/folly/blob/main/folly/docs/small_vector.md"><div class="csl-block">https://github.com/facebook/folly/blob/main/folly/docs/small_vector.md</div></a>
</div>
<div id="ref-Etl" class="csl-entry" role="doc-biblioentry">
[4] John Wellbelove. Embedded Template Library. <a href="https://www.etlcpp.com/vector.html"><div class="csl-block">https://www.etlcpp.com/vector.html</div></a>
</div>
<div id="ref-BoostDoc" class="csl-entry" role="doc-biblioentry">
[5] Ion Gaztanaga. boost/container/static_vector.hpp. <a href="https://www.boost.org/doc/libs/1_59_0/doc/html/boost_container_header_reference.html#header.boost.container.static_vector_hpp"><div class="csl-block">https://www.boost.org/doc/libs/1_59_0/doc/html/boost_container_header_reference.html#header.boost.container.static_vector_hpp</div></a>
</div>
<div id="ref-BoostImpl" class="csl-entry" role="doc-biblioentry">
[6] Ion Gaztanaga. boost/container/vector.hpp. <a href="https://www.boost.org/doc/libs/1_59_0/boost/container/vector.hpp"><div class="csl-block">https://www.boost.org/doc/libs/1_59_0/boost/container/vector.hpp</div></a>
</div>
<div id="ref-EastlImpl" class="csl-entry" role="doc-biblioentry">
[7] Electronic Arts Inc. eastl/fixed_vector.h. <a href="https://github.com/questor/eastl/blob/624c573fefbd5e9382e726a42590cd8dc9f03916/vector.h#L1999-L2045"><div class="csl-block">https://github.com/questor/eastl/blob/624c573fefbd5e9382e726a42590cd8dc9f03916/vector.h#L1999-L2045</div></a>
</div>
<div id="ref-FollyImpl" class="csl-entry" role="doc-biblioentry">
[8] Meta Platforms, Inc. folly/container/small_vector.h. <a href="https://github.com/facebook/folly/blob/d17bf897cb5bbf8f07b122a614e8cffdc38edcde/folly/container/small_vector.h#L644-L659"><div class="csl-block">https://github.com/facebook/folly/blob/d17bf897cb5bbf8f07b122a614e8cffdc38edcde/folly/container/small_vector.h#L644-L659</div></a>
</div>
<div id="ref-EtlImpl" class="csl-entry" role="doc-biblioentry">
[9] John Wellbelove. etl/vector.h. <a href="https://github.com/ETLCPP/etl/blob/a12dbbd91174e895bdd5492826b0226b9668fc5f/include/etl/vector.h#L1115-L1192"><div class="csl-block">https://github.com/ETLCPP/etl/blob/a12dbbd91174e895bdd5492826b0226b9668fc5f/include/etl/vector.h#L1115-L1192</div></a>
</div>
<div id="ref-N5008" class="csl-entry" role="doc-biblioentry">
[N5008] Thomas Köppe. 2025-03-15. Working Draft, Programming Languages —
C++. <a href="https://wg21.link/n5008"><div class="csl-block">https://wg21.link/n5008</div></a>
</div>
<div id="ref-P0805R2" class="csl-entry" role="doc-biblioentry">
[P0805R2] Marshall Clow. 2018-06-22. Comparing Containers. <a href="https://wg21.link/p0805r2"><div class="csl-block">https://wg21.link/p0805r2</div></a>
</div>
<div id="ref-P0843R14" class="csl-entry" role="doc-biblioentry">
[P0843R14] Gonzalo Brito Gadeschi, Timur Doumler, Nevin Liber, David
Sankel. 2024-06-26. inplace_vector. <a href="https://wg21.link/p0843r14"><div class="csl-block">https://wg21.link/p0843r14</div></a>
</div>
</div>
</div>
</div>
</body>
</html>
