<!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="2024-12-15" />
  <title>flat_meow Fixes</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">flat_meow Fixes</h1>
<table style="border:none;float:right">
  <tr>
    <td>Document #:</td>
    <td>P3567R0</td>
  </tr>
  <tr>
    <td>Date:</td>
    <td>2024-12-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>
      LEWG, LWG<br>
    </td>
  </tr>
  <tr>
    <td style="vertical-align:top">Reply-to:</td>
    <td>
      Hui Xie<br>&lt;<a href="mailto:hui.xie1990@gmail.com" class="email">hui.xie1990@gmail.com</a>&gt;<br>
      Louis Dionne<br>&lt;<a href="mailto:ldionne.2@gmail.com" class="email">ldionne.2@gmail.com</a>&gt;<br>
      Arthur O’Dwyer<br>&lt;<a href="mailto:arthur.j.odwyer@gmail.com" class="email">arthur.j.odwyer@gmail.com</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="#introduction" id="toc-introduction"><span class="toc-section-number">2</span> Introduction<span></span></a></li>
<li><a href="#lwg-4000-flat_mapinsert_range-fix" id="toc-lwg-4000-flat_mapinsert_range-fix"><span class="toc-section-number">3</span> LWG 4000: <code class="sourceCode cpp">flat_map<span class="op">::</span>insert_range</code>
Fix<span></span></a>
<ul>
<li><a href="#wording" id="toc-wording"><span class="toc-section-number">3.1</span> Wording<span></span></a></li>
</ul></li>
<li><a href="#swap-should-be-conditionally-noexcept" id="toc-swap-should-be-conditionally-noexcept"><span class="toc-section-number">4</span>
<code class="sourceCode cpp">swap</code> Should be Conditionally
<code class="sourceCode cpp"><span class="kw">noexcept</span></code><span></span></a>
<ul>
<li><a href="#wording-1" id="toc-wording-1"><span class="toc-section-number">4.1</span> Wording<span></span></a></li>
</ul></li>
<li><a href="#missing-insert_rangesorted_unique-rg" id="toc-missing-insert_rangesorted_unique-rg"><span class="toc-section-number">5</span> Missing <code class="sourceCode cpp">insert_range<span class="op">(</span>sorted_unique, rg<span class="op">)</span></code><span></span></a>
<ul>
<li><a href="#wording-2" id="toc-wording-2"><span class="toc-section-number">5.1</span> Wording<span></span></a>
<ul>
<li><a href="#flat_map" id="toc-flat_map"><span class="toc-section-number">5.1.1</span>
<code class="sourceCode cpp">flat_map</code><span></span></a></li>
<li><a href="#flat_multimap" id="toc-flat_multimap"><span class="toc-section-number">5.1.2</span>
<code class="sourceCode cpp">flat_multimap</code><span></span></a></li>
<li><a href="#flat_set" id="toc-flat_set"><span class="toc-section-number">5.1.3</span>
<code class="sourceCode cpp">flat_set</code><span></span></a></li>
<li><a href="#flat_multiset" id="toc-flat_multiset"><span class="toc-section-number">5.1.4</span>
<code class="sourceCode cpp">flat_multiset</code><span></span></a></li>
</ul></li>
</ul></li>
<li><a href="#flat_setinsert_range" id="toc-flat_setinsert_range"><span class="toc-section-number">6</span> <code class="sourceCode cpp">flat_set<span class="op">::</span>insert_range</code><span></span></a>
<ul>
<li><a href="#wording-3" id="toc-wording-3"><span class="toc-section-number">6.1</span> Wording<span></span></a></li>
</ul></li>
<li><a href="#underspecified-special-member-functions" id="toc-underspecified-special-member-functions"><span class="toc-section-number">7</span> Underspecified special member
functions<span></span></a>
<ul>
<li><a href="#wording-4" id="toc-wording-4"><span class="toc-section-number">7.1</span> Wording<span></span></a>
<ul>
<li><a href="#flat_map-wording" id="toc-flat_map-wording"><span class="toc-section-number">7.1.1</span>
<code class="sourceCode cpp">flat_map</code>
Wording<span></span></a></li>
<li><a href="#flat_multimap-wording" id="toc-flat_multimap-wording"><span class="toc-section-number">7.1.2</span>
<code class="sourceCode cpp">flat_multimap</code>
Wording<span></span></a></li>
<li><a href="#flat_set-wording" id="toc-flat_set-wording"><span class="toc-section-number">7.1.3</span>
<code class="sourceCode cpp">flat_set</code>
Wording<span></span></a></li>
<li><a href="#flat_multiset-wording" id="toc-flat_multiset-wording"><span class="toc-section-number">7.1.4</span>
<code class="sourceCode cpp">flat_multiset</code>
Wording<span></span></a></li>
</ul></li>
</ul></li>
<li><a href="#implementation-experience" id="toc-implementation-experience"><span class="toc-section-number">8</span> Implementation
Experience<span></span></a></li>
<li><a href="#feature-test-macro" id="toc-feature-test-macro"><span class="toc-section-number">9</span> Feature Test
Macro<span></span></a></li>
<li><a href="#bibliography" id="toc-bibliography"><span class="toc-section-number">10</span> References<span></span></a></li>
</ul>
</div>
<h1 data-number="1" id="abstract"><span class="header-section-number">1</span> Abstract<a href="#abstract" class="self-link"></a></h1>
<p>This paper proposes a subset of the fixes in <span class="citation" data-cites="P2767R2">[<a href="https://wg21.link/p2767r2" role="doc-biblioref">P2767R2</a>]</span> to
<code class="sourceCode cpp">flat_map</code>,
<code class="sourceCode cpp">flat_multimap</code>,
<code class="sourceCode cpp">flat_set</code>, and
<code class="sourceCode cpp">flat_multiset</code> based on libc++’s
implementation.</p>
<h1 data-number="2" id="introduction"><span class="header-section-number">2</span> Introduction<a href="#introduction" class="self-link"></a></h1>
<p><span class="citation" data-cites="P2767R2">[<a href="https://wg21.link/p2767r2" role="doc-biblioref">P2767R2</a>]</span> proposed a set of changes to
<code class="sourceCode cpp">flat_map</code>,
<code class="sourceCode cpp">flat_multimap</code>,
<code class="sourceCode cpp">flat_set</code>, and
<code class="sourceCode cpp">flat_multiset</code>, based on the author’s
implementation experience. However, the paper contains not only some
straight forward fixes, but also some design changes, which did not get
consensus in previous meetings. We (libc++) have recently released the
<code class="sourceCode cpp">flat_map</code> implementation. After
consulting the author of the original paper <span class="citation" data-cites="P2767R2">[<a href="https://wg21.link/p2767r2" role="doc-biblioref">P2767R2</a>]</span>, we decided to create a new
paper which contains a subset of the non-controversial fixes based on
our implementation experience.</p>
<h1 data-number="3" id="lwg-4000-flat_mapinsert_range-fix"><span class="header-section-number">3</span> LWG 4000: <code class="sourceCode cpp">flat_map<span class="op">::</span>insert_range</code>
Fix<a href="#lwg-4000-flat_mapinsert_range-fix" class="self-link"></a></h1>
<p>As stated in <span class="citation" data-cites="LWG4000">[<a href="https://wg21.link/lwg4000" role="doc-biblioref">LWG4000</a>]</span>, <code class="sourceCode cpp">flat_map<span class="op">::</span>insert_range</code>
has an obvious bug. But for some reason, this LWG issue was not moved
forward, possibly due to the existence of <span class="citation" data-cites="P2767R2">[<a href="https://wg21.link/p2767r2" role="doc-biblioref">P2767R2</a>]</span>. The fix is twofold: first, we
use <code class="sourceCode cpp">value_type</code> explicitly to make
sure that <code class="sourceCode cpp">e</code> is a
<code class="sourceCode cpp">std<span class="op">::</span>pair</code>,
and we move to <code class="sourceCode cpp">ranges<span class="op">::</span>for_each</code>
for consistency with the rest of the
<code class="sourceCode cpp">flat_map</code> specification.</p>
<h2 data-number="3.1" id="wording"><span class="header-section-number">3.1</span> Wording<a href="#wording" class="self-link"></a></h2>
<p>Change <span>23.6.8.7
<a href="https://wg21.link/flat.map.modifiers">[flat.map.modifiers]</a></span>
paragraph 12 to:</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="kw">template</span><span class="op">&lt;</span>container<span class="op">-</span>compatible<span class="op">-</span>range<span class="op">&lt;</span>value_type<span class="op">&gt;</span> R<span class="op">&gt;</span></span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a>  <span class="dt">void</span> insert_range<span class="op">(</span>R<span class="op">&amp;&amp;</span> rg<span class="op">)</span>;</span></code></pre></div>
<div class="bq">
<p><span class="marginalizedparent"><a class="marginalized">12</a></span>
<em>Effects</em>: Adds elements to <code class="sourceCode cpp">c</code>
as if by:</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="rm" style="color: #bf0303"><del><span><code class="sourceCode default">for (const auto&amp; e : rg) {</code></span></del></span></span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">ranges::for_each(rg, [&amp;c](value_type e) {</code></span></ins></span></span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a>  c<span class="op">.</span>keys<span class="op">.</span>insert<span class="op">(</span>c<span class="op">.</span>keys<span class="op">.</span>end<span class="op">()</span>, <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">std::move(</code></span></ins></span>e<span class="op">.</span>first<span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">)</code></span></ins></span><span class="op">)</span>;</span>
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a>  c<span class="op">.</span>values<span class="op">.</span>insert<span class="op">(</span>c<span class="op">.</span>values<span class="op">.</span>end<span class="op">()</span>, <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">std::move(</code></span></ins></span>e<span class="op">.</span>second<span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">)</code></span></ins></span><span class="op">)</span>;</span>
<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a><span class="op">}</span><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">);</code></span></ins></span></span></code></pre></div>
<p>Then, sorts the range of newly inserted elements with respect to
<code class="sourceCode cpp">value_comp<span class="op">()</span></code>;
merges the resulting sorted range and the sorted range of pre-existing
elements into a single sorted range; and finally erases the duplicate
elements as if by:</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="kw">auto</span> zv <span class="op">=</span> views<span class="op">::</span>zip<span class="op">(</span>c<span class="op">.</span>keys, c<span class="op">.</span>values<span class="op">)</span>;</span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a><span class="kw">auto</span> it <span class="op">=</span> ranges<span class="op">::</span>unique<span class="op">(</span>zv, key_equiv<span class="op">(</span>compare<span class="op">)).</span>begin<span class="op">()</span>;</span>
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a><span class="kw">auto</span> dist <span class="op">=</span> distance<span class="op">(</span>zv<span class="op">.</span>begin<span class="op">()</span>, it<span class="op">)</span>;</span>
<span id="cb3-4"><a href="#cb3-4" aria-hidden="true" tabindex="-1"></a>c<span class="op">.</span>keys<span class="op">.</span>erase<span class="op">(</span>c<span class="op">.</span>keys<span class="op">.</span>begin<span class="op">()</span> <span class="op">+</span> dist, c<span class="op">.</span>keys<span class="op">.</span>end<span class="op">())</span>;</span>
<span id="cb3-5"><a href="#cb3-5" aria-hidden="true" tabindex="-1"></a>c<span class="op">.</span>values<span class="op">.</span>erase<span class="op">(</span>c<span class="op">.</span>values<span class="op">.</span>begin<span class="op">()</span> <span class="op">+</span> dist, c<span class="op">.</span>values<span class="op">.</span>end<span class="op">())</span>;</span></code></pre></div>
</div>
<h1 data-number="4" id="swap-should-be-conditionally-noexcept"><span class="header-section-number">4</span>
<code class="sourceCode cpp">swap</code> Should be Conditionally
<code class="sourceCode cpp"><span class="kw">noexcept</span></code><a href="#swap-should-be-conditionally-noexcept" class="self-link"></a></h1>
<p><code class="sourceCode cpp">flat_meow<span class="op">::</span>swap</code> is
currently specified as unconditionally
<code class="sourceCode cpp"><span class="kw">noexcept</span></code>. In
case the underlying container’s <code class="sourceCode cpp">swap</code>
throws an exception, implementations have to either</p>
<ol type="1">
<li>Swallow the exception and restore invariants. Practically speaking,
this means clearing both containers.</li>
<li><code class="sourceCode cpp">std<span class="op">::</span>terminate</code></li>
</ol>
<p>The first option is extremely bad because users will silently get an
empty <code class="sourceCode cpp">flat_meow</code> after a failed
<code class="sourceCode cpp">swap</code>. The second option is extremely
harsh.</p>
<p>Instead, making <code class="sourceCode cpp">swap</code>
conditionally-<code class="sourceCode cpp"><span class="kw">noexcept</span></code>
allows us to propagate the exception (after restoring invariants).</p>
<h2 data-number="4.1" id="wording-1"><span class="header-section-number">4.1</span> Wording<a href="#wording-1" class="self-link"></a></h2>
<p>Change <span>23.6.8.2
<a href="https://wg21.link/flat.map.defn">[flat.map.defn]</a></span> as
follows:</p>
<div class="sourceCode" id="cb4"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a><span class="dt">void</span> swap<span class="op">(</span>flat_map<span class="op">&amp;</span> y<span class="op">)</span> <span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">noexcept;</code></span></del></span></span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">noexcept(is_nothrow_swappable_v&lt;key_container_type&gt; &amp;&amp;</code></span></ins></span></span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a>           <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">is_nothrow_swappable_v&lt;mapped_container_type&gt; &amp;&amp;</code></span></ins></span></span>
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a>           <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">is_nothrow_swappable_v&lt;key_compare&gt;);</code></span></ins></span></span>
<span id="cb4-5"><a href="#cb4-5" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-6"><a href="#cb4-6" aria-hidden="true" tabindex="-1"></a><span class="co">// ...</span></span>
<span id="cb4-7"><a href="#cb4-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-8"><a href="#cb4-8" aria-hidden="true" tabindex="-1"></a><span class="kw">friend</span> <span class="dt">void</span> swap<span class="op">(</span>flat_map<span class="op">&amp;</span> x, flat_map<span class="op">&amp;</span> y<span class="op">)</span> <span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">noexcept</code></span></del></span></span>
<span id="cb4-9"><a href="#cb4-9" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">noexcept(is_nothrow_swappable_v&lt;key_container_type&gt; &amp;&amp;</code></span></ins></span></span>
<span id="cb4-10"><a href="#cb4-10" aria-hidden="true" tabindex="-1"></a>           <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">is_nothrow_swappable_v&lt;mapped_container_type&gt; &amp;&amp;</code></span></ins></span></span>
<span id="cb4-11"><a href="#cb4-11" aria-hidden="true" tabindex="-1"></a>           <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">is_nothrow_swappable_v&lt;key_compare&gt;)</code></span></ins></span></span>
<span id="cb4-12"><a href="#cb4-12" aria-hidden="true" tabindex="-1"></a>  <span class="op">{</span> x<span class="op">.</span>swap<span class="op">(</span>y<span class="op">)</span>; <span class="op">}</span></span></code></pre></div>
<p>Change <span>23.6.8.7
<a href="https://wg21.link/flat.map.modifiers">[flat.map.modifiers]</a></span>
paragraph 33:</p>
<div class="sourceCode" id="cb5"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a><span class="dt">void</span> swap<span class="op">(</span>flat_map<span class="op">&amp;</span> y<span class="op">)</span> <span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">noexcept;</code></span></del></span></span>
<span id="cb5-2"><a href="#cb5-2" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">noexcept(is_nothrow_swappable_v&lt;key_container_type&gt; &amp;&amp;</code></span></ins></span></span>
<span id="cb5-3"><a href="#cb5-3" aria-hidden="true" tabindex="-1"></a>           <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">is_nothrow_swappable_v&lt;mapped_container_type&gt; &amp;&amp;</code></span></ins></span></span>
<span id="cb5-4"><a href="#cb5-4" aria-hidden="true" tabindex="-1"></a>           <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">is_nothrow_swappable_v&lt;key_compare&gt;);</code></span></ins></span></span></code></pre></div>
<div class="bq">
<p><span class="marginalizedparent"><a class="marginalized">33</a></span>
<em>Effects</em>: Equivalent to:</p>
<div class="sourceCode" id="cb6"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a>ranges<span class="op">::</span>swap<span class="op">(</span>compare, y<span class="op">.</span>compare<span class="op">)</span>;</span>
<span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a>ranges<span class="op">::</span>swap<span class="op">(</span>c<span class="op">.</span>keys, y<span class="op">.</span>c<span class="op">.</span>keys<span class="op">)</span>;</span>
<span id="cb6-3"><a href="#cb6-3" aria-hidden="true" tabindex="-1"></a>ranges<span class="op">::</span>swap<span class="op">(</span>c<span class="op">.</span>values, y<span class="op">.</span>c<span class="op">.</span>values<span class="op">)</span>;</span></code></pre></div>
</div>
<p>Change <span>23.6.9.2
<a href="https://wg21.link/flat.multimap.defn">[flat.multimap.defn]</a></span>
as follows:</p>
<div class="sourceCode" id="cb7"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a><span class="dt">void</span> swap<span class="op">(</span>flat_multimap<span class="op">&amp;</span> y<span class="op">)</span> <span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">noexcept;</code></span></del></span></span>
<span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">noexcept(is_nothrow_swappable_v&lt;key_container_type&gt; &amp;&amp;</code></span></ins></span></span>
<span id="cb7-3"><a href="#cb7-3" aria-hidden="true" tabindex="-1"></a>           <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">is_nothrow_swappable_v&lt;mapped_container_type&gt; &amp;&amp;</code></span></ins></span></span>
<span id="cb7-4"><a href="#cb7-4" aria-hidden="true" tabindex="-1"></a>           <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">is_nothrow_swappable_v&lt;key_compare&gt;);</code></span></ins></span></span>
<span id="cb7-5"><a href="#cb7-5" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-6"><a href="#cb7-6" aria-hidden="true" tabindex="-1"></a><span class="co">// ...</span></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 class="kw">friend</span> <span class="dt">void</span> swap<span class="op">(</span>flat_multimap<span class="op">&amp;</span> x, flat_multimap<span class="op">&amp;</span> y<span class="op">)</span> <span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">noexcept</code></span></del></span></span>
<span id="cb7-9"><a href="#cb7-9" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">noexcept(is_nothrow_swappable_v&lt;key_container_type&gt; &amp;&amp;</code></span></ins></span></span>
<span id="cb7-10"><a href="#cb7-10" aria-hidden="true" tabindex="-1"></a>           <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">is_nothrow_swappable_v&lt;mapped_container_type&gt; &amp;&amp;</code></span></ins></span></span>
<span id="cb7-11"><a href="#cb7-11" aria-hidden="true" tabindex="-1"></a>           <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">is_nothrow_swappable_v&lt;key_compare&gt;)</code></span></ins></span></span>
<span id="cb7-12"><a href="#cb7-12" aria-hidden="true" tabindex="-1"></a>  <span class="op">{</span> x<span class="op">.</span>swap<span class="op">(</span>y<span class="op">)</span>; <span class="op">}</span></span></code></pre></div>
<p>Change <span>23.6.11.2
<a href="https://wg21.link/flat.set.defn">[flat.set.defn]</a></span> as
follows:</p>
<div class="sourceCode" id="cb8"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a><span class="dt">void</span> swap<span class="op">(</span>flat_set<span class="op">&amp;</span> y<span class="op">)</span> <span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">noexcept;</code></span></del></span></span>
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">noexcept(is_nothrow_swappable_v&lt;container_type&gt; &amp;&amp;</code></span></ins></span></span>
<span id="cb8-3"><a href="#cb8-3" aria-hidden="true" tabindex="-1"></a>           <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">is_nothrow_swappable_v&lt;key_compare&gt;);</code></span></ins></span></span>
<span id="cb8-4"><a href="#cb8-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-5"><a href="#cb8-5" aria-hidden="true" tabindex="-1"></a><span class="co">// ...</span></span>
<span id="cb8-6"><a href="#cb8-6" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-7"><a href="#cb8-7" aria-hidden="true" tabindex="-1"></a><span class="kw">friend</span> <span class="dt">void</span> swap<span class="op">(</span>flat_set<span class="op">&amp;</span> x, flat_set<span class="op">&amp;</span> y<span class="op">)</span> <span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">noexcept</code></span></del></span></span>
<span id="cb8-8"><a href="#cb8-8" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">noexcept(is_nothrow_swappable_v&lt;container_type&gt; &amp;&amp;</code></span></ins></span></span>
<span id="cb8-9"><a href="#cb8-9" aria-hidden="true" tabindex="-1"></a>           <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">is_nothrow_swappable_v&lt;key_compare&gt;)</code></span></ins></span></span>
<span id="cb8-10"><a href="#cb8-10" aria-hidden="true" tabindex="-1"></a>  <span class="op">{</span> x<span class="op">.</span>swap<span class="op">(</span>y<span class="op">)</span>; <span class="op">}</span></span></code></pre></div>
<p>Change <span>23.6.11.5
<a href="https://wg21.link/flat.set.modifiers">[flat.set.modifiers]</a></span>
paragraph 13:</p>
<div class="sourceCode" id="cb9"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true" tabindex="-1"></a><span class="dt">void</span> swap<span class="op">(</span>flat_set<span class="op">&amp;</span> y<span class="op">)</span> <span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">noexcept;</code></span></del></span></span>
<span id="cb9-2"><a href="#cb9-2" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">noexcept(is_nothrow_swappable_v&lt;container_type&gt; &amp;&amp;</code></span></ins></span></span>
<span id="cb9-3"><a href="#cb9-3" aria-hidden="true" tabindex="-1"></a>           <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">is_nothrow_swappable_v&lt;key_compare&gt;);</code></span></ins></span></span></code></pre></div>
<div class="bq">
<p><span class="marginalizedparent"><a class="marginalized">13</a></span>
<em>Effects</em>: Equivalent to:</p>
<div class="sourceCode" id="cb10"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true" tabindex="-1"></a>ranges<span class="op">::</span>swap<span class="op">(</span>compare, y<span class="op">.</span>compare<span class="op">)</span>;</span>
<span id="cb10-2"><a href="#cb10-2" aria-hidden="true" tabindex="-1"></a>ranges<span class="op">::</span>swap<span class="op">(</span>c, y<span class="op">.</span>c<span class="op">)</span>;</span></code></pre></div>
</div>
<p>Change <span>23.6.12.2
<a href="https://wg21.link/flat.multiset.defn">[flat.multiset.defn]</a></span>
as follows:</p>
<div class="sourceCode" id="cb11"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true" tabindex="-1"></a><span class="dt">void</span> swap<span class="op">(</span>flat_multiset<span class="op">&amp;</span> y<span class="op">)</span> <span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">noexcept;</code></span></del></span></span>
<span id="cb11-2"><a href="#cb11-2" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">noexcept(is_nothrow_swappable_v&lt;container_type&gt; &amp;&amp;</code></span></ins></span></span>
<span id="cb11-3"><a href="#cb11-3" aria-hidden="true" tabindex="-1"></a>           <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">is_nothrow_swappable_v&lt;key_compare&gt;);</code></span></ins></span></span>
<span id="cb11-4"><a href="#cb11-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb11-5"><a href="#cb11-5" aria-hidden="true" tabindex="-1"></a><span class="co">// ...</span></span>
<span id="cb11-6"><a href="#cb11-6" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb11-7"><a href="#cb11-7" aria-hidden="true" tabindex="-1"></a><span class="kw">friend</span> <span class="dt">void</span> swap<span class="op">(</span>flat_multiset<span class="op">&amp;</span> x, flat_multiset<span class="op">&amp;</span> y<span class="op">)</span> <span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">noexcept</code></span></del></span></span>
<span id="cb11-8"><a href="#cb11-8" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">noexcept(is_nothrow_swappable_v&lt;container_type&gt; &amp;&amp;</code></span></ins></span></span>
<span id="cb11-9"><a href="#cb11-9" aria-hidden="true" tabindex="-1"></a>           <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">is_nothrow_swappable_v&lt;key_compare&gt;)</code></span></ins></span></span>
<span id="cb11-10"><a href="#cb11-10" aria-hidden="true" tabindex="-1"></a>  <span class="op">{</span> x<span class="op">.</span>swap<span class="op">(</span>y<span class="op">)</span>; <span class="op">}</span></span></code></pre></div>
<p>Change <span>23.6.12.5
<a href="https://wg21.link/flat.multiset.modifiers">[flat.multiset.modifiers]</a></span>
paragraph 9:</p>
<div class="sourceCode" id="cb12"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true" tabindex="-1"></a><span class="dt">void</span> swap<span class="op">(</span>flat_multiset<span class="op">&amp;</span> y<span class="op">)</span> <span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">noexcept;</code></span></del></span></span>
<span id="cb12-2"><a href="#cb12-2" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">noexcept(is_nothrow_swappable_v&lt;container_type&gt; &amp;&amp;</code></span></ins></span></span>
<span id="cb12-3"><a href="#cb12-3" aria-hidden="true" tabindex="-1"></a>           <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">is_nothrow_swappable_v&lt;key_compare&gt;);</code></span></ins></span></span></code></pre></div>
<div class="bq">
<p><span class="marginalizedparent"><a class="marginalized">9</a></span>
<em>Effects</em>: Equivalent to:</p>
<div class="sourceCode" id="cb13"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true" tabindex="-1"></a>ranges<span class="op">::</span>swap<span class="op">(</span>compare, y<span class="op">.</span>compare<span class="op">)</span>;</span>
<span id="cb13-2"><a href="#cb13-2" aria-hidden="true" tabindex="-1"></a>ranges<span class="op">::</span>swap<span class="op">(</span>c, y<span class="op">.</span>c<span class="op">)</span>;</span></code></pre></div>
</div>
<h1 data-number="5" id="missing-insert_rangesorted_unique-rg"><span class="header-section-number">5</span> Missing <code class="sourceCode cpp">insert_range<span class="op">(</span>sorted_unique, rg<span class="op">)</span></code><a href="#missing-insert_rangesorted_unique-rg" class="self-link"></a></h1>
<p>The multi-element insertion API consists of two sets of
overloads:</p>
<ul>
<li>A set of overloads that take a potentially-unsorted range</li>
<li>A set of overloads that take a
<code class="sourceCode cpp">sorted_unique</code> range</li>
</ul>
<div class="sourceCode" id="cb14"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb14-1"><a href="#cb14-1" aria-hidden="true" tabindex="-1"></a>insert<span class="op">(</span>first, last<span class="op">)</span>;                 <span class="co">// 1a</span></span>
<span id="cb14-2"><a href="#cb14-2" aria-hidden="true" tabindex="-1"></a>insert<span class="op">(</span>il<span class="op">)</span>;                          <span class="co">// 2a</span></span>
<span id="cb14-3"><a href="#cb14-3" aria-hidden="true" tabindex="-1"></a>insert_range<span class="op">(</span>rg<span class="op">)</span>;                    <span class="co">// 3a</span></span>
<span id="cb14-4"><a href="#cb14-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb14-5"><a href="#cb14-5" aria-hidden="true" tabindex="-1"></a>insert<span class="op">(</span>sorted_unique, first, last<span class="op">)</span>;  <span class="co">// 1b</span></span>
<span id="cb14-6"><a href="#cb14-6" aria-hidden="true" tabindex="-1"></a>insert<span class="op">(</span>sorted_unique, il<span class="op">)</span>;           <span class="co">// 2b</span></span>
<span id="cb14-7"><a href="#cb14-7" aria-hidden="true" tabindex="-1"></a>insert_range<span class="op">(</span>sorted_unique, rg<span class="op">)</span>      <span class="co">// 3b is conspicuously missing.</span></span></code></pre></div>
<p>However, the last overload <code class="sourceCode cpp">insert_range<span class="op">(</span>sorted_unique, rg<span class="op">)</span></code>
is missing. This could be an oversight in the original proposal. This is
true for <code class="sourceCode cpp">flat_set</code> and
<code class="sourceCode cpp">flat_map</code>. Similarly, in
<code class="sourceCode cpp">flat_multiset</code> and
<code class="sourceCode cpp">flat_multimap</code>, the overload <code class="sourceCode cpp">insert_range<span class="op">(</span>sorted_equivalent, rg<span class="op">)</span></code>
is also missing.</p>
<h2 data-number="5.1" id="wording-2"><span class="header-section-number">5.1</span> Wording<a href="#wording-2" class="self-link"></a></h2>
<h3 data-number="5.1.1" id="flat_map"><span class="header-section-number">5.1.1</span>
<code class="sourceCode cpp">flat_map</code><a href="#flat_map" class="self-link"></a></h3>
<p>Change <span>23.6.8.2
<a href="https://wg21.link/flat.map.defn">[flat.map.defn]</a></span> as
follows:</p>
<div class="sourceCode" id="cb15"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb15-1"><a href="#cb15-1" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> InputIterator<span class="op">&gt;</span></span>
<span id="cb15-2"><a href="#cb15-2" aria-hidden="true" tabindex="-1"></a>  <span class="dt">void</span> insert<span class="op">(</span>InputIterator first, InputIterator last<span class="op">)</span>;</span>
<span id="cb15-3"><a href="#cb15-3" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> InputIterator<span class="op">&gt;</span></span>
<span id="cb15-4"><a href="#cb15-4" aria-hidden="true" tabindex="-1"></a>  <span class="dt">void</span> insert<span class="op">(</span>sorted_unique_t, InputIterator first, InputIterator last<span class="op">)</span>;</span>
<span id="cb15-5"><a href="#cb15-5" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span>container<span class="op">-</span>compatible<span class="op">-</span>range<span class="op">&lt;</span>value_type<span class="op">&gt;</span> R<span class="op">&gt;</span></span>
<span id="cb15-6"><a href="#cb15-6" aria-hidden="true" tabindex="-1"></a>  <span class="dt">void</span> insert_range<span class="op">(</span>R<span class="op">&amp;&amp;</span> rg<span class="op">)</span>;</span>
<span id="cb15-7"><a href="#cb15-7" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">template&lt;container-compatible-range&lt;value_type&gt; R&gt;</code></span></ins></span></span>
<span id="cb15-8"><a href="#cb15-8" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">void insert_range(sorted_unique_t, R&amp;&amp; rg);</code></span></ins></span></span></code></pre></div>
<p>Add a new entry to <span>23.6.8.7
<a href="https://wg21.link/flat.map.modifiers">[flat.map.modifiers]</a></span>
after paragraph 14:</p>
<div class="sourceCode" id="cb16"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb16-1"><a href="#cb16-1" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span>container<span class="op">-</span>compatible<span class="op">-</span>range<span class="op">&lt;</span>value_type<span class="op">&gt;</span> R<span class="op">&gt;</span></span>
<span id="cb16-2"><a href="#cb16-2" aria-hidden="true" tabindex="-1"></a>  <span class="dt">void</span> insert_range<span class="op">(</span>sorted_unique_t, R<span class="op">&amp;&amp;</span> rg<span class="op">)</span>;</span></code></pre></div>
<div class="bq">
<p><span class="marginalizedparent"><a class="marginalized">15</a></span>
<em>Effects</em>: Adds elements to <code class="sourceCode cpp">c</code>
as if by:</p>
<div class="sourceCode" id="cb17"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb17-1"><a href="#cb17-1" aria-hidden="true" tabindex="-1"></a>ranges<span class="op">::</span>for_each<span class="op">(</span>rg, <span class="op">[&amp;</span>c<span class="op">](</span>value_type e<span class="op">)</span> <span class="op">{</span></span>
<span id="cb17-2"><a href="#cb17-2" aria-hidden="true" tabindex="-1"></a>  c<span class="op">.</span>keys<span class="op">.</span>insert<span class="op">(</span>c<span class="op">.</span>keys<span class="op">.</span>end<span class="op">()</span>, std<span class="op">::</span>move<span class="op">(</span>e<span class="op">.</span>first<span class="op">))</span>;</span>
<span id="cb17-3"><a href="#cb17-3" aria-hidden="true" tabindex="-1"></a>  c<span class="op">.</span>values<span class="op">.</span>insert<span class="op">(</span>c<span class="op">.</span>values<span class="op">.</span>end<span class="op">()</span>, std<span class="op">::</span>move<span class="op">(</span>e<span class="op">.</span>second<span class="op">))</span>;</span>
<span id="cb17-4"><a href="#cb17-4" aria-hidden="true" tabindex="-1"></a><span class="op">})</span>;</span></code></pre></div>
<p>Then, merges the newly inserted sorted range and the sorted range of
pre-existing elements into a single sorted range; and finally erases the
duplicate elements as if by:</p>
<div class="sourceCode" id="cb18"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb18-1"><a href="#cb18-1" aria-hidden="true" tabindex="-1"></a><span class="kw">auto</span> zv <span class="op">=</span> views<span class="op">::</span>zip<span class="op">(</span>c<span class="op">.</span>keys, c<span class="op">.</span>values<span class="op">)</span>;</span>
<span id="cb18-2"><a href="#cb18-2" aria-hidden="true" tabindex="-1"></a><span class="kw">auto</span> it <span class="op">=</span> ranges<span class="op">::</span>unique<span class="op">(</span>zv, key_equiv<span class="op">(</span>compare<span class="op">)).</span>begin<span class="op">()</span>;</span>
<span id="cb18-3"><a href="#cb18-3" aria-hidden="true" tabindex="-1"></a><span class="kw">auto</span> dist <span class="op">=</span> distance<span class="op">(</span>zv<span class="op">.</span>begin<span class="op">()</span>, it<span class="op">)</span>;</span>
<span id="cb18-4"><a href="#cb18-4" aria-hidden="true" tabindex="-1"></a>c<span class="op">.</span>keys<span class="op">.</span>erase<span class="op">(</span>c<span class="op">.</span>keys<span class="op">.</span>begin<span class="op">()</span> <span class="op">+</span> dist, c<span class="op">.</span>keys<span class="op">.</span>end<span class="op">())</span>;</span>
<span id="cb18-5"><a href="#cb18-5" aria-hidden="true" tabindex="-1"></a>c<span class="op">.</span>values<span class="op">.</span>erase<span class="op">(</span>c<span class="op">.</span>values<span class="op">.</span>begin<span class="op">()</span> <span class="op">+</span> dist, c<span class="op">.</span>values<span class="op">.</span>end<span class="op">())</span>;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">16</a></span>
<em>Complexity</em>: Linear in <em>N</em>, where <em>N</em> is
<code class="sourceCode cpp">size<span class="op">()</span></code> after
the operation.</p>
<p><span class="marginalizedparent"><a class="marginalized">17</a></span>
<em>Remarks</em>: Since this operation performs an in-place merge, it
may allocate memory.</p>
</div>
<h3 data-number="5.1.2" id="flat_multimap"><span class="header-section-number">5.1.2</span>
<code class="sourceCode cpp">flat_multimap</code><a href="#flat_multimap" class="self-link"></a></h3>
<p>Change <span>23.6.9.2
<a href="https://wg21.link/flat.multimap.defn">[flat.multimap.defn]</a></span>
as follows:</p>
<div class="sourceCode" id="cb19"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb19-1"><a href="#cb19-1" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> InputIterator<span class="op">&gt;</span></span>
<span id="cb19-2"><a href="#cb19-2" aria-hidden="true" tabindex="-1"></a>  <span class="dt">void</span> insert<span class="op">(</span>InputIterator first, InputIterator last<span class="op">)</span>;</span>
<span id="cb19-3"><a href="#cb19-3" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> InputIterator<span class="op">&gt;</span></span>
<span id="cb19-4"><a href="#cb19-4" aria-hidden="true" tabindex="-1"></a>  <span class="dt">void</span> insert<span class="op">(</span>sorted_equivalent_t, InputIterator first, InputIterator last<span class="op">)</span>;</span>
<span id="cb19-5"><a href="#cb19-5" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span>container<span class="op">-</span>compatible<span class="op">-</span>range<span class="op">&lt;</span>value_type<span class="op">&gt;</span> R<span class="op">&gt;</span></span>
<span id="cb19-6"><a href="#cb19-6" aria-hidden="true" tabindex="-1"></a>  <span class="dt">void</span> insert_range<span class="op">(</span>R<span class="op">&amp;&amp;</span> rg<span class="op">)</span>;</span>
<span id="cb19-7"><a href="#cb19-7" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">template&lt;container-compatible-range&lt;value_type&gt; R&gt;</code></span></ins></span></span>
<span id="cb19-8"><a href="#cb19-8" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">void insert_range(sorted_equivalent_t, R&amp;&amp; rg);</code></span></ins></span></span></code></pre></div>
<h3 data-number="5.1.3" id="flat_set"><span class="header-section-number">5.1.3</span>
<code class="sourceCode cpp">flat_set</code><a href="#flat_set" class="self-link"></a></h3>
<p>Change <span>23.6.11.2
<a href="https://wg21.link/flat.set.defn">[flat.set.defn]</a></span> as
follows:</p>
<div class="sourceCode" id="cb20"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb20-1"><a href="#cb20-1" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> InputIterator<span class="op">&gt;</span></span>
<span id="cb20-2"><a href="#cb20-2" aria-hidden="true" tabindex="-1"></a>  <span class="dt">void</span> insert<span class="op">(</span>InputIterator first, InputIterator last<span class="op">)</span>;</span>
<span id="cb20-3"><a href="#cb20-3" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> InputIterator<span class="op">&gt;</span></span>
<span id="cb20-4"><a href="#cb20-4" aria-hidden="true" tabindex="-1"></a>  <span class="dt">void</span> insert<span class="op">(</span>sorted_unique_t, InputIterator first, InputIterator last<span class="op">)</span>;</span>
<span id="cb20-5"><a href="#cb20-5" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span>container<span class="op">-</span>compatible<span class="op">-</span>range<span class="op">&lt;</span>value_type<span class="op">&gt;</span> R<span class="op">&gt;</span></span>
<span id="cb20-6"><a href="#cb20-6" aria-hidden="true" tabindex="-1"></a>  <span class="dt">void</span> insert_range<span class="op">(</span>R<span class="op">&amp;&amp;</span> rg<span class="op">)</span>;</span>
<span id="cb20-7"><a href="#cb20-7" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">template&lt;container-compatible-range&lt;value_type&gt; R&gt;</code></span></ins></span></span>
<span id="cb20-8"><a href="#cb20-8" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">void insert_range(sorted_unique_t, R&amp;&amp; rg);</code></span></ins></span></span></code></pre></div>
<p>Add a new entry to <span>23.6.11.5
<a href="https://wg21.link/flat.set.modifiers">[flat.set.modifiers]</a></span>
after paragraph 12:</p>
<div class="sourceCode" id="cb21"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb21-1"><a href="#cb21-1" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span>container<span class="op">-</span>compatible<span class="op">-</span>range<span class="op">&lt;</span>value_type<span class="op">&gt;</span> R<span class="op">&gt;</span></span>
<span id="cb21-2"><a href="#cb21-2" aria-hidden="true" tabindex="-1"></a>  <span class="dt">void</span> insert_range<span class="op">(</span>sorted_unique_t, R<span class="op">&amp;&amp;</span> rg<span class="op">)</span>;</span></code></pre></div>
<div class="bq">
<p><span class="marginalizedparent"><a class="marginalized">13</a></span>
<em>Effects</em>: Equivalent to <code class="sourceCode cpp">insert_range<span class="op">(</span>rg<span class="op">)</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">14</a></span>
<em>Complexity</em>: Linear in <em>N</em>, where <em>N</em> is
<code class="sourceCode cpp">size<span class="op">()</span></code> after
the operation.</p>
</div>
<h3 data-number="5.1.4" id="flat_multiset"><span class="header-section-number">5.1.4</span>
<code class="sourceCode cpp">flat_multiset</code><a href="#flat_multiset" class="self-link"></a></h3>
<p>Change <span>23.6.12.2
<a href="https://wg21.link/flat.multiset.defn">[flat.multiset.defn]</a></span>
as follows:</p>
<div class="sourceCode" id="cb22"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb22-1"><a href="#cb22-1" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> InputIterator<span class="op">&gt;</span></span>
<span id="cb22-2"><a href="#cb22-2" aria-hidden="true" tabindex="-1"></a>  <span class="dt">void</span> insert<span class="op">(</span>InputIterator first, InputIterator last<span class="op">)</span>;</span>
<span id="cb22-3"><a href="#cb22-3" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> InputIterator<span class="op">&gt;</span></span>
<span id="cb22-4"><a href="#cb22-4" aria-hidden="true" tabindex="-1"></a>  <span class="dt">void</span> insert<span class="op">(</span>sorted_equivalent_t, InputIterator first, InputIterator last<span class="op">)</span>;</span>
<span id="cb22-5"><a href="#cb22-5" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span>container<span class="op">-</span>compatible<span class="op">-</span>range<span class="op">&lt;</span>value_type<span class="op">&gt;</span> R<span class="op">&gt;</span></span>
<span id="cb22-6"><a href="#cb22-6" aria-hidden="true" tabindex="-1"></a>  <span class="dt">void</span> insert_range<span class="op">(</span>R<span class="op">&amp;&amp;</span> rg<span class="op">)</span>;</span>
<span id="cb22-7"><a href="#cb22-7" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">template&lt;container-compatible-range&lt;value_type&gt; R&gt;</code></span></ins></span></span>
<span id="cb22-8"><a href="#cb22-8" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">void insert_range(sorted_equivalent_t, R&amp;&amp; rg);</code></span></ins></span></span></code></pre></div>
<h1 data-number="6" id="flat_setinsert_range"><span class="header-section-number">6</span> <code class="sourceCode cpp">flat_set<span class="op">::</span>insert_range</code><a href="#flat_setinsert_range" class="self-link"></a></h1>
<p>The current specification for <code class="sourceCode cpp">flat_set<span class="op">::</span>insert_range</code>
seems to unnecessarily pessimize by forcing copies of the elements:</p>
<div class="sourceCode" id="cb23"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb23-1"><a href="#cb23-1" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span>container<span class="op">-</span>compatible<span class="op">-</span>range<span class="op">&lt;</span>value_type<span class="op">&gt;</span> R<span class="op">&gt;</span></span>
<span id="cb23-2"><a href="#cb23-2" aria-hidden="true" tabindex="-1"></a>  <span class="dt">void</span> insert_range<span class="op">(</span>R<span class="op">&amp;&amp;</span> rg<span class="op">)</span>;</span></code></pre></div>
<div class="bq">
<p><span class="marginalizedparent"><a class="marginalized">10</a></span>
<em>Effects</em>: Adds elements to <code class="sourceCode cpp">c</code>
as if by:</p>
<div class="sourceCode" id="cb24"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb24-1"><a href="#cb24-1" aria-hidden="true" tabindex="-1"></a><span class="cf">for</span> <span class="op">(</span><span class="kw">const</span> <span class="kw">auto</span><span class="op">&amp;</span> e <span class="op">:</span> rg<span class="op">)</span> <span class="op">{</span></span>
<span id="cb24-2"><a href="#cb24-2" aria-hidden="true" tabindex="-1"></a>  c<span class="op">.</span>insert<span class="op">(</span>c<span class="op">.</span>end<span class="op">()</span>, e<span class="op">)</span>; <span class="co">// COPYING HERE</span></span>
<span id="cb24-3"><a href="#cb24-3" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
</div>
<p>We should allow implementations to move when they can.</p>
<h2 data-number="6.1" id="wording-3"><span class="header-section-number">6.1</span> Wording<a href="#wording-3" class="self-link"></a></h2>
<p>Change <span>23.6.11.5
<a href="https://wg21.link/flat.set.modifiers">[flat.set.modifiers]</a></span>
paragraph 10 as follows:</p>
<div class="sourceCode" id="cb25"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb25-1"><a href="#cb25-1" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span>container<span class="op">-</span>compatible<span class="op">-</span>range<span class="op">&lt;</span>value_type<span class="op">&gt;</span> R<span class="op">&gt;</span></span>
<span id="cb25-2"><a href="#cb25-2" aria-hidden="true" tabindex="-1"></a>  <span class="dt">void</span> insert_range<span class="op">(</span>R<span class="op">&amp;&amp;</span> rg<span class="op">)</span>;</span></code></pre></div>
<div class="bq">
<p><span class="marginalizedparent"><a class="marginalized">10</a></span>
<em>Effects</em>: Adds elements to <code class="sourceCode cpp">c</code>
as if by:</p>
<div class="sourceCode" id="cb26"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb26-1"><a href="#cb26-1" aria-hidden="true" tabindex="-1"></a><span class="cf">for</span> <span class="op">(</span><span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">const auto&amp;</code></span></del></span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">auto&amp;&amp;</code></span></ins></span> e <span class="op">:</span> rg<span class="op">)</span> <span class="op">{</span></span>
<span id="cb26-2"><a href="#cb26-2" aria-hidden="true" tabindex="-1"></a>  c<span class="op">.</span>insert<span class="op">(</span>c<span class="op">.</span>end<span class="op">()</span>, <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">std::forward&lt;decltype(e)&gt;(</code></span></ins></span>e<span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">)</code></span></ins></span><span class="op">)</span>;</span>
<span id="cb26-3"><a href="#cb26-3" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p>Then, sorts the range of newly inserted elements with respect to
compare; merges the resulting sorted range and the sorted range of
pre-existing elements into a single sorted range; and finally erases all
but the first element from each group of consecutive equivalent
elements.</p>
</div>
<h1 data-number="7" id="underspecified-special-member-functions"><span class="header-section-number">7</span> Underspecified special member
functions<a href="#underspecified-special-member-functions" class="self-link"></a></h1>
<p>The special member functions for
<code class="sourceCode cpp">flat_meow</code> are currently not
specified explicitly. This means that an implementation using e.g. <code class="sourceCode cpp">flat_map<span class="op">(</span>flat_map<span class="op">&amp;&amp;)</span> <span class="op">=</span> <span class="cf">default</span></code>
would be conforming. However, such an implementation would not be
correct with respect to exception handling. Indeed, if an exception is
thrown while moving from the incoming map, the incoming map would be
left in a potentially invalid state with respect to its invariants.</p>
<p>Note that the <a href="http://eel.is/c++draft/container.adaptors#flat.map.overview-6">blanket
paragraph</a> does not apply here, since we’re concerned with the
incoming <code class="sourceCode cpp">flat_map</code>’s invariants, not
<code class="sourceCode cpp"><span class="op">*</span><span class="kw">this</span></code>’s
invariants. We believe that the behavior of these special member
functions must be specified explicitly, otherwise these constructors are
useless in any context where an exception can be thrown.</p>
<h2 data-number="7.1" id="wording-4"><span class="header-section-number">7.1</span> Wording<a href="#wording-4" class="self-link"></a></h2>
<h3 data-number="7.1.1" id="flat_map-wording"><span class="header-section-number">7.1.1</span>
<code class="sourceCode cpp">flat_map</code> Wording<a href="#flat_map-wording" class="self-link"></a></h3>
<p>Change <span>23.6.8.2
<a href="https://wg21.link/flat.map.defn">[flat.map.defn]</a></span> as
follows:</p>
<div class="sourceCode" id="cb27"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb27-1"><a href="#cb27-1" aria-hidden="true" tabindex="-1"></a><span class="co">// [flat.map.cons], constructors</span></span>
<span id="cb27-2"><a href="#cb27-2" aria-hidden="true" tabindex="-1"></a>flat_map<span class="op">()</span> <span class="op">:</span> flat_map<span class="op">(</span>key_compare<span class="op">())</span> <span class="op">{</span> <span class="op">}</span></span>
<span id="cb27-3"><a href="#cb27-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb27-4"><a href="#cb27-4" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">flat_map(const flat_map&amp;);</code></span></ins></span></span>
<span id="cb27-5"><a href="#cb27-5" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">flat_map(flat_map&amp;&amp;);</code></span></ins></span></span>
<span id="cb27-6"><a href="#cb27-6" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">flat_map&amp; operator=(const flat_map&amp;);</code></span></ins></span></span>
<span id="cb27-7"><a href="#cb27-7" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">flat_map&amp; operator=(flat_map&amp;&amp;);</code></span></ins></span></span></code></pre></div>
<p>Add a new entry to <span>23.6.8.3
<a href="https://wg21.link/flat.map.cons">[flat.map.cons]</a></span> at
the beginning:</p>
<div class="sourceCode" id="cb28"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb28-1"><a href="#cb28-1" aria-hidden="true" tabindex="-1"></a>flat_map<span class="op">(</span>flat_map<span class="op">&amp;&amp;</span> o<span class="op">)</span>;</span></code></pre></div>
<div class="bq">
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em>Effects</em>: Initialize
<code class="sourceCode cpp"><em>c</em></code> with <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>o<span class="op">.</span><em>c</em><span class="op">)</span></code>
and <code class="sourceCode cpp"><em>compare</em></code> with <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>o<span class="op">.</span><em>compare</em><span class="op">)</span></code>.
If the function exits via an exception, the invariants of
<code class="sourceCode cpp">o</code> are restored.</p>
</div>
<div class="sourceCode" id="cb29"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb29-1"><a href="#cb29-1" aria-hidden="true" tabindex="-1"></a>flat_map<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">=(</span>flat_map<span class="op">&amp;&amp;</span> o<span class="op">)</span>;</span></code></pre></div>
<div class="bq">
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Effects</em>: Assigns <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>o<span class="op">.</span><em>c</em><span class="op">)</span></code>
to <code class="sourceCode cpp"><em>c</em></code> and <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>o<span class="op">.</span><em>compare</em><span class="op">)</span></code>
to <code class="sourceCode cpp"><em>compare</em></code>. If the function
exits via an exception, the invariants of
<code class="sourceCode cpp">o</code> and <code class="sourceCode cpp"><span class="op">*</span><span class="kw">this</span></code>
are restored.</p>
</div>
<blockquote>
<p>Drafting note: Our intent is not to mandate implementations to move
or not move the comparator, but we are not certain how to word things
such that both implementations are valid.</p>
</blockquote>
<h3 data-number="7.1.2" id="flat_multimap-wording"><span class="header-section-number">7.1.2</span>
<code class="sourceCode cpp">flat_multimap</code> Wording<a href="#flat_multimap-wording" class="self-link"></a></h3>
<p>Change <span>23.6.9.2
<a href="https://wg21.link/flat.multimap.defn">[flat.multimap.defn]</a></span>
as follows:</p>
<div class="sourceCode" id="cb30"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb30-1"><a href="#cb30-1" aria-hidden="true" tabindex="-1"></a><span class="co">// [flat.multimap.cons], constructors</span></span>
<span id="cb30-2"><a href="#cb30-2" aria-hidden="true" tabindex="-1"></a>flat_multimap<span class="op">()</span> <span class="op">:</span> flat_multimap<span class="op">(</span>key_compare<span class="op">())</span> <span class="op">{</span> <span class="op">}</span></span>
<span id="cb30-3"><a href="#cb30-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb30-4"><a href="#cb30-4" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">flat_multimap(const flat_multimap&amp;);</code></span></ins></span></span>
<span id="cb30-5"><a href="#cb30-5" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">flat_multimap(flat_multimap&amp;&amp;);</code></span></ins></span></span>
<span id="cb30-6"><a href="#cb30-6" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">flat_multimap&amp; operator=(const flat_multimap&amp;);</code></span></ins></span></span>
<span id="cb30-7"><a href="#cb30-7" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">flat_multimap&amp; operator=(flat_multimap&amp;&amp;);</code></span></ins></span></span></code></pre></div>
<p>Add a new entry to <span>23.6.9.3
<a href="https://wg21.link/flat.multimap.cons">[flat.multimap.cons]</a></span>
at the beginning:</p>
<div class="sourceCode" id="cb31"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb31-1"><a href="#cb31-1" aria-hidden="true" tabindex="-1"></a>flat_multimap<span class="op">(</span>flat_multimap<span class="op">&amp;&amp;</span> o<span class="op">)</span>;</span></code></pre></div>
<div class="bq">
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em>Effects</em>: Initialize
<code class="sourceCode cpp"><em>c</em></code> with <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>o<span class="op">.</span><em>c</em><span class="op">)</span></code>
and <code class="sourceCode cpp"><em>compare</em></code> with <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>o<span class="op">.</span><em>compare</em><span class="op">)</span></code>.
If the function exits via an exception, the invariants of
<code class="sourceCode cpp">o</code> are restored.</p>
</div>
<div class="sourceCode" id="cb32"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb32-1"><a href="#cb32-1" aria-hidden="true" tabindex="-1"></a>flat_multimap<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">=(</span>flat_multimap<span class="op">&amp;&amp;</span> o<span class="op">)</span>;</span></code></pre></div>
<div class="bq">
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Effects</em>: Assigns <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>o<span class="op">.</span><em>c</em><span class="op">)</span></code>
to <code class="sourceCode cpp"><em>c</em></code> and <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>o<span class="op">.</span><em>compare</em><span class="op">)</span></code>
to <code class="sourceCode cpp"><em>compare</em></code>. If the function
exits via an exception, the invariants of
<code class="sourceCode cpp">o</code> and <code class="sourceCode cpp"><span class="op">*</span><span class="kw">this</span></code>
are restored.</p>
</div>
<h3 data-number="7.1.3" id="flat_set-wording"><span class="header-section-number">7.1.3</span>
<code class="sourceCode cpp">flat_set</code> Wording<a href="#flat_set-wording" class="self-link"></a></h3>
<p>Change <span>23.6.11.2
<a href="https://wg21.link/flat.set.defn">[flat.set.defn]</a></span> as
follows:</p>
<div class="sourceCode" id="cb33"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb33-1"><a href="#cb33-1" aria-hidden="true" tabindex="-1"></a><span class="co">// [flat.set.cons], constructors</span></span>
<span id="cb33-2"><a href="#cb33-2" aria-hidden="true" tabindex="-1"></a>flat_set<span class="op">()</span> <span class="op">:</span> flat_set<span class="op">(</span>key_compare<span class="op">())</span> <span class="op">{</span> <span class="op">}</span></span>
<span id="cb33-3"><a href="#cb33-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb33-4"><a href="#cb33-4" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">flat_set(const flat_set&amp;);</code></span></ins></span></span>
<span id="cb33-5"><a href="#cb33-5" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">flat_set(flat_set&amp;&amp;);</code></span></ins></span></span>
<span id="cb33-6"><a href="#cb33-6" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">flat_set&amp; operator=(const flat_set&amp;);</code></span></ins></span></span>
<span id="cb33-7"><a href="#cb33-7" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">flat_set&amp; operator=(flat_set&amp;&amp;);</code></span></ins></span></span></code></pre></div>
<p>Add a new entry to <span>23.6.11.3
<a href="https://wg21.link/flat.set.cons">[flat.set.cons]</a></span> at
the beginning:</p>
<div class="sourceCode" id="cb34"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb34-1"><a href="#cb34-1" aria-hidden="true" tabindex="-1"></a>flat_set<span class="op">(</span>flat_set<span class="op">&amp;&amp;</span> o<span class="op">)</span>;</span></code></pre></div>
<div class="bq">
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em>Effects</em>: Initialize
<code class="sourceCode cpp"><em>c</em></code> with <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>o<span class="op">.</span><em>c</em><span class="op">)</span></code>
and <code class="sourceCode cpp"><em>compare</em></code> with <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>o<span class="op">.</span><em>compare</em><span class="op">)</span></code>.
If the function exits via an exception, the invariants of
<code class="sourceCode cpp">o</code> are restored.</p>
</div>
<div class="sourceCode" id="cb35"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb35-1"><a href="#cb35-1" aria-hidden="true" tabindex="-1"></a>flat_set<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">=(</span>flat_set<span class="op">&amp;&amp;</span> o<span class="op">)</span>;</span></code></pre></div>
<div class="bq">
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Effects</em>: Assigns <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>o<span class="op">.</span><em>c</em><span class="op">)</span></code>
to <code class="sourceCode cpp"><em>c</em></code> and <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>o<span class="op">.</span><em>compare</em><span class="op">)</span></code>
to <code class="sourceCode cpp"><em>compare</em></code>. If the function
exits via an exception, the invariants of
<code class="sourceCode cpp">o</code> and <code class="sourceCode cpp"><span class="op">*</span><span class="kw">this</span></code>
are restored.</p>
</div>
<h3 data-number="7.1.4" id="flat_multiset-wording"><span class="header-section-number">7.1.4</span>
<code class="sourceCode cpp">flat_multiset</code> Wording<a href="#flat_multiset-wording" class="self-link"></a></h3>
<p>Change <span>23.6.12.2
<a href="https://wg21.link/flat.multiset.defn">[flat.multiset.defn]</a></span>
as follows:</p>
<div class="sourceCode" id="cb36"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb36-1"><a href="#cb36-1" aria-hidden="true" tabindex="-1"></a><span class="co">// [flat.multiset.cons], constructors</span></span>
<span id="cb36-2"><a href="#cb36-2" aria-hidden="true" tabindex="-1"></a>flat_multiset<span class="op">()</span> <span class="op">:</span> flat_multiset<span class="op">(</span>key_compare<span class="op">())</span> <span class="op">{</span> <span class="op">}</span></span>
<span id="cb36-3"><a href="#cb36-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb36-4"><a href="#cb36-4" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">flat_multiset(const flat_multiset&amp;);</code></span></ins></span></span>
<span id="cb36-5"><a href="#cb36-5" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">flat_multiset(flat_multiset&amp;&amp;);</code></span></ins></span></span>
<span id="cb36-6"><a href="#cb36-6" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">flat_multiset&amp; operator=(const flat_multiset&amp;);</code></span></ins></span></span>
<span id="cb36-7"><a href="#cb36-7" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">flat_multiset&amp; operator=(flat_multiset&amp;&amp;);</code></span></ins></span></span></code></pre></div>
<p>Add a new entry to <span>23.6.12.3
<a href="https://wg21.link/flat.multiset.cons">[flat.multiset.cons]</a></span>
at the beginning:</p>
<div class="sourceCode" id="cb37"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb37-1"><a href="#cb37-1" aria-hidden="true" tabindex="-1"></a>flat_multiset<span class="op">(</span>flat_multiset<span class="op">&amp;&amp;</span> o<span class="op">)</span>;</span></code></pre></div>
<div class="bq">
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em>Effects</em>: Initialize
<code class="sourceCode cpp"><em>c</em></code> with <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>o<span class="op">.</span><em>c</em><span class="op">)</span></code>
and <code class="sourceCode cpp"><em>compare</em></code> with <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>o<span class="op">.</span><em>compare</em><span class="op">)</span></code>.
If the function exits via an exception, the invariants of
<code class="sourceCode cpp">o</code> are restored.</p>
</div>
<div class="sourceCode" id="cb38"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb38-1"><a href="#cb38-1" aria-hidden="true" tabindex="-1"></a>flat_multiset<span class="op">&amp;</span> <span class="kw">operator</span><span class="op">=(</span>flat_multiset<span class="op">&amp;&amp;</span> o<span class="op">)</span>;</span></code></pre></div>
<div class="bq">
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Effects</em>: Assigns <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>o<span class="op">.</span><em>c</em><span class="op">)</span></code>
to <code class="sourceCode cpp"><em>c</em></code> and <code class="sourceCode cpp">std<span class="op">::</span>move<span class="op">(</span>o<span class="op">.</span><em>compare</em><span class="op">)</span></code>
to <code class="sourceCode cpp"><em>compare</em></code>. If the function
exits via an exception, the invariants of
<code class="sourceCode cpp">o</code> and <code class="sourceCode cpp"><span class="op">*</span><span class="kw">this</span></code>
are restored.</p>
</div>
<p>Note: We purposefully do not add
<code class="sourceCode cpp"><span class="kw">noexcept</span></code>
specifiers to any of these member functions. Doing so is a complicated
subject that is the target of <a href="http://wg21.link/LWG2227">LWG2227</a> and we would prefer to solve
that problem separately. In practice, implementations are free to
strengthen
<code class="sourceCode cpp"><span class="kw">noexcept</span></code>
specifications if they so desire.</p>
<h1 data-number="8" id="implementation-experience"><span class="header-section-number">8</span> Implementation Experience<a href="#implementation-experience" class="self-link"></a></h1>
<p>This paper is based on our implementation in libc++.</p>
<h1 data-number="9" id="feature-test-macro"><span class="header-section-number">9</span> Feature Test Macro<a href="#feature-test-macro" class="self-link"></a></h1>
<p>Bump <code class="sourceCode cpp">__cpp_lib_flat_map</code> and
<code class="sourceCode cpp">__cpp_lib_flat_set</code>
appropriately.</p>
<style>
.bq{
    display: block;
    margin-block-start: 1em;
    margin-block-end: 1em;
    margin-inline-start: 40px;
    margin-inline-end: 40px;
}
</style>
<h1 data-number="10" id="bibliography"><span class="header-section-number">10</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-LWG4000" class="csl-entry" role="doc-biblioentry">
[LWG4000] Hewill Kang. flat_map::insert_range’s Effects is not quite
right. <a href="https://wg21.link/lwg4000"><div class="csl-block">https://wg21.link/lwg4000</div></a>
</div>
<div id="ref-P2767R2" class="csl-entry" role="doc-biblioentry">
[P2767R2] Arthur O’Dwyer. 2023-12-09. flat_map/flat_set omnibus. <a href="https://wg21.link/p2767r2"><div class="csl-block">https://wg21.link/p2767r2</div></a>
</div>
</div>
</div>
</div>
</body>
</html>
