<!doctype html><html lang="en">
 <head>
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  <meta content="width=device-width, initial-scale=1, shrink-to-fit=no" name="viewport">
  <title>P2384R1: 2021 Spring Library Evolution Poll Outcomes</title>
<style data-fill-with="stylesheet">/******************************************************************************
 *                   Style sheet for the W3C specifications                   *
 *
 * Special classes handled by this style sheet include:
 *
 * Indices
 *   - .toc for the Table of Contents (<ol class="toc">)
 *     + <span class="secno"> for the section numbers
 *   - #toc for the Table of Contents (<nav id="toc">)
 *   - ul.index for Indices (<a href="#ref">term</a><span>, in § N.M</span>)
 *   - table.index for Index Tables (e.g. for properties or elements)
 *
 * Structural Markup
 *   - table.data for general data tables
 *     -> use 'scope' attribute, <colgroup>, <thead>, and <tbody> for best results !
 *     -> use <table class='complex data'> for extra-complex tables
 *     -> use <td class='long'> for paragraph-length cell content
 *     -> use <td class='pre'> when manual line breaks/indentation would help readability
 *   - dl.switch for switch statements
 *   - ol.algorithm for algorithms (helps to visualize nesting)
 *   - .figure and .caption (HTML4) and figure and figcaption (HTML5)
 *     -> .sidefigure for right-floated figures
 *   - ins/del
 *     -> ins/del.c### for candidate and proposed changes (amendments)
 *
 * Code
 *   - pre and code
 *
 * Special Sections
 *   - .note       for informative notes             (div, p, span, aside, details)
 *   - .example    for informative examples          (div, p, pre, span)
 *   - .issue      for issues                        (div, p, span)
 *   - .advisement for loud normative statements     (div, p, strong)
 *   - .annoying-warning for spec obsoletion notices (div, aside, details)
 *   - .correction for "candidate corrections"       (div, aside, details, section)
 *   - .addition   for "candidate additions"         (div, aside, details, section)
 *   - .correction.proposed for "proposed corrections" (div, aside, details, section)
 *   - .addition.proposed   for "proposed additions"   (div, aside, details, section)
 *
 * Definition Boxes
 *   - pre.def   for WebIDL definitions
 *   - table.def for tables that define other entities (e.g. CSS properties)
 *   - dl.def    for definition lists that define other entitles (e.g. HTML elements)
 *
 * Numbering
 *   - .secno for section numbers in .toc and headings (<span class='secno'>3.2</span>)
 *   - .marker for source-inserted example/figure/issue numbers (<span class='marker'>Issue 4</span>)
 *   - ::before styled for CSS-generated issue/example/figure numbers:
 *     -> Documents wishing to use this only need to add
 *        figcaption::before,
 *        .caption::before { content: "Figure "  counter(figure) " ";  }
 *        .example::before { content: "Example " counter(example) " "; }
 *        .issue::before   { content: "Issue "   counter(issue) " ";   }
 *
 * Header Stuff (ignore, just don't conflict with these classes)
 *   - .head for the header
 *   - .copyright for the copyright
 *
 * Outdated warning for old specs
 *
 * Miscellaneous
 *   - .overlarge for things that should be as wide as possible, even if
 *     that overflows the body text area. This can be used on an item or
 *     on its container, depending on the effect desired.
 *     Note that this styling basically doesn't help at all when printing,
 *     since A4 paper isn't much wider than the max-width here.
 *     It's better to design things to fit into a narrower measure if possible.
 *
 *   - js-added ToC jump links (see fixup.js)
 *
 ******************************************************************************/

/* color variables included separately for reliability */

/******************************************************************************/
/*                                    Body                                    */
/******************************************************************************/

	html {
	}

	body {
		counter-reset: example figure issue;

		/* Layout */
		max-width: 50em;			  /* limit line length to 50em for readability   */
		margin: 0 auto;				/* center text within page                    */
		padding: 1.6em 1.5em 2em 50px; /* assume 16px font size for downlevel clients */
		padding: 1.6em 1.5em 2em calc(26px + 1.5em); /* leave space for status flag    */

		/* Typography */
		line-height: 1.5;
		font-family: sans-serif;
		widows: 2;
		orphans: 2;
		word-wrap: break-word;
		overflow-wrap: break-word;
		hyphens: auto;

		color: black;
		color: var(--text);
		background: white top left fixed no-repeat;
		background: var(--bg) top left fixed no-repeat;
		background-size: 25px auto;
	}


/******************************************************************************/
/*                         Front Matter & Navigation                          */
/******************************************************************************/

/** Header ********************************************************************/

	div.head { margin-bottom: 1em; }
	div.head hr { border-style: solid; }

	div.head h1 {
		font-weight: bold;
		margin: 0 0 .1em;
		font-size: 220%;
	}

	div.head h2 { margin-bottom: 1.5em;}

/** W3C Logo ******************************************************************/

	.head .logo {
		float: right;
		margin: 0.4rem 0 0.2rem .4rem;
	}

	.head img[src*="logos/W3C"] {
		display: block;
		border: solid #1a5e9a;
		border: solid var(--logo-bg);
		border-width: .65rem .7rem .6rem;
		border-radius: .4rem;
		background: #1a5e9a;
		background: var(--logo-bg);
		color: white;
		color: var(--logo-text);
		font-weight: bold;
	}

	.head a:hover > img[src*="logos/W3C"],
	.head a:focus > img[src*="logos/W3C"] {
		opacity: .8;
	}

	.head a:active > img[src*="logos/W3C"] {
		background: #c00;
		background: var(--logo-active-bg);
		border-color: #c00;
		border-color: var(--logo-active-bg);
	}

	/* see also additional rules in Link Styling section */

/** Copyright *****************************************************************/

	p.copyright,
	p.copyright small { font-size: small; }

/** Back to Top / ToC Toggle **************************************************/

	@media print {
		#toc-nav {
			display: none;
		}
	}
	@media not print {
		#toc-nav {
			position: fixed;
			z-index: 3;
			bottom: 0; left: 0;
			margin: 0;
			min-width: 1.33em;
			border-top-right-radius: 2rem;
			box-shadow: 0 0 2px;
			font-size: 1.5em;
		}
		#toc-nav > a {
			display: block;
			white-space: nowrap;

			height: 1.33em;
			padding: .1em 0.3em;
			margin: 0;

			box-shadow: 0 0 2px;
			border: none;
			border-top-right-radius: 1.33em;

			color: #707070;
			color: var(--tocnav-normal-text);
			background: white;
			background: var(--tocnav-normal-bg);
		}
		#toc-nav > a:hover,
		#toc-nav > a:focus {
			color: black;
			color: var(--tocnav-hover-text);
			background: #f8f8f8;
			background: var(--tocnav-hover-bg);
		}
		#toc-nav > a:active {
			color: #c00;
			color: var(--tocnav-active-text);
			background: white;
			background: var(--tocnav-active-bg);
		}

		#toc-nav > #toc-jump {
			padding-bottom: 2em;
			margin-bottom: -1.9em;
		}

		/* statusbar gets in the way on keyboard focus; remove once browsers fix */
		#toc-nav > a[href="#toc"]:not(:hover):focus:last-child {
			padding-bottom: 1.5rem;
		}

		#toc-nav:not(:hover) > a:not(:focus) > span + span {
			/* Ideally this uses :focus-within on #toc-nav */
			display: none;
		}
		#toc-nav > a > span + span {
			padding-right: 0.2em;
		}
	}

/** ToC Sidebar ***************************************************************/

	/* Floating sidebar */
	@media screen {
		body.toc-sidebar #toc {
			position: fixed;
			top: 0; bottom: 0;
			left: 0;
			width: 23.5em;
			max-width: 80%;
			max-width: calc(100% - 2em - 26px);
			overflow: auto;
			padding: 0 1em;
			padding-left: 42px;
			padding-left: calc(1em + 26px);
			color: black;
			color: var(--tocsidebar-text);
			background: inherit;
			background-color: #f7f8f9;
			background-color: var(--tocsidebar-bg);
			z-index: 1;
			box-shadow: -.1em 0 .25em rgba(0,0,0,.1) inset;
			box-shadow: -.1em 0 .25em var(--tocsidebar-shadow) inset;
		}
		body.toc-sidebar #toc h2 {
			margin-top: .8rem;
			font-variant: small-caps;
			font-variant: all-small-caps;
			text-transform: lowercase;
			font-weight: bold;
			color: gray;
			color: hsla(203,20%,40%,.7);
			color: var(--tocsidebar-heading-text);
		}
		body.toc-sidebar #toc-jump:not(:focus) {
			width: 0;
			height: 0;
			padding: 0;
			position: absolute;
			overflow: hidden;
		}
	}
	/* Hide main scroller when only the ToC is visible anyway */
	@media screen and (max-width: 28em) {
		body.toc-sidebar {
			overflow: hidden;
		}
	}

	/* Sidebar with its own space */
	@media screen and (min-width: 78em) {
		body:not(.toc-inline) #toc {
			position: fixed;
			top: 0; bottom: 0;
			left: 0;
			width: 23.5em;
			overflow: auto;
			padding: 0 1em;
			padding-left: 42px;
			padding-left: calc(1em + 26px);
			color: black;
			color: var(--tocsidebar-text);
			background: inherit;
			background-color: #f7f8f9;
			background-color: var(--tocsidebar-bg);
			z-index: 1;
			box-shadow: -.1em 0 .25em rgba(0,0,0,.1) inset;
			box-shadow: -.1em 0 .25em var(--tocsidebar-shadow) inset;
		}
		body:not(.toc-inline) #toc h2 {
			margin-top: .8rem;
			font-variant: small-caps;
			font-variant: all-small-caps;
			text-transform: lowercase;
			font-weight: bold;
			color: gray;
			color: hsla(203,20%,40%,.7);
			color: var(--tocsidebar-heading-text);
		}

		body:not(.toc-inline) {
			padding-left: 29em;
		}
		/* See also Overflow section at the bottom */

		body:not(.toc-inline) #toc-jump:not(:focus) {
			width: 0;
			height: 0;
			padding: 0;
			position: absolute;
			overflow: hidden;
		}
	}
	@media screen and (min-width: 90em) {
		body:not(.toc-inline) {
			margin: 0 4em;
		}
	}

/******************************************************************************/
/*                                Sectioning                                  */
/******************************************************************************/

/** Headings ******************************************************************/

	h1, h2, h3, h4, h5, h6, dt {
		page-break-after: avoid;
		page-break-inside: avoid;
		font: 100% sans-serif;   /* Reset all font styling to clear out UA styles */
		font-family: inherit;	/* Inherit the font family. */
		line-height: 1.2;		/* Keep wrapped headings compact */
		hyphens: manual;		/* Hyphenated headings look weird */
	}

	h2, h3, h4, h5, h6 {
		margin-top: 3rem;
	}

	h1, h2, h3 {
		color: #005A9C;
		color: var(--heading-text);
	}

	h1 { font-size: 170%; }
	h2 { font-size: 140%; }
	h3 { font-size: 120%; }
	h4 { font-weight: bold; }
	h5 { font-style: italic; }
	h6 { font-variant: small-caps; }
	dt { font-weight: bold; }

/** Subheadings ***************************************************************/

	h1 + h2,
	#profile-and-date {
		/* #profile-and-date is a subtitle in an H2 under the H1 */
		margin-top: 0;
	}
	h2 + h3,
	h3 + h4,
	h4 + h5,
	h5 + h6 {
		margin-top: 1.2em; /* = 1 x line-height */
	}

/** Section divider ***********************************************************/

	:not(.head) > :not(.head) + hr {
		font-size: 1.5em;
		text-align: center;
		margin: 1em auto;
		height: auto;
		color: black;
		color: var(--hr-text);
		border: transparent solid 0;
		background: transparent;
	}
	:not(.head) > hr::before {
		content: "\2727\2003\2003\2727\2003\2003\2727";
	}

/******************************************************************************/
/*                            Paragraphs and Lists                            */
/******************************************************************************/

	p {
		margin: 1em 0;
	}

	dd > p:first-child,
	li > p:first-child {
		margin-top: 0;
	}

	ul, ol {
		margin-left: 0;
		padding-left: 2em;
	}

	li {
		margin: 0.25em 0 0.5em;
		padding: 0;
	}

	dl dd {
		margin: 0 0 .5em 2em;
	}

	.head dd + dd { /* compact for header */
		margin-top: -.5em;
	}

	/* Style for algorithms */
	ol.algorithm ol:not(.algorithm),
	.algorithm > ol ol:not(.algorithm) {
	border-left: 0.5em solid #DEF;
	border-left: 0.5em solid var(--algo-border);
	}

	/* Put nice boxes around each algorithm. */
	[data-algorithm]:not(.heading) {
	 padding: .5em;
	 border: thin solid #ddd;
	 border: thin solid var(--algo-border);
	 border-radius: .5em;
	 margin: .5em calc(-0.5em - 1px);
	}
	[data-algorithm]:not(.heading) > :first-child {
	 margin-top: 0;
	}
	[data-algorithm]:not(.heading) > :last-child {
	 margin-bottom: 0;
	}

	/* Style for switch/case <dl>s */
	dl.switch > dd > ol.only,
	dl.switch > dd > .only > ol {
	margin-left: 0;
	}
	dl.switch > dd > ol.algorithm,
	dl.switch > dd > .algorithm > ol {
	margin-left: -2em;
	}
	dl.switch {
	padding-left: 2em;
	}
	dl.switch > dt {
	text-indent: -1.5em;
	margin-top: 1em;
	}
	dl.switch > dt + dt {
	margin-top: 0;
	}
	dl.switch > dt::before {
	content: '\21AA';
	padding: 0 0.5em 0 0;
	display: inline-block;
	width: 1em;
	text-align: right;
	line-height: 0.5em;
	}

/** Terminology Markup ********************************************************/


/******************************************************************************/
/*                                 Inline Markup                              */
/******************************************************************************/

/** Terminology Markup ********************************************************/
	dfn   { /* Defining instance */
		font-weight: bolder;
	}
	a > i { /* Instance of term */
		font-style: normal;
	}
	dt dfn code, code.idl {
		font-size: inherit;
	}
	dfn var {
		font-style: normal;
	}

/** Change Marking ************************************************************/

	del {
		color: #aa0000;
		color: var(--del-text);
		background: transparent;
		background: var(--del-bg);
		text-decoration: line-through;
	}
	ins {
		color: #006100;
		color: var(--ins-text);
		background: transparent;
		background: var(--ins-bg);
		text-decoration: underline;
	}

	/* for amendments (candidate/proposed changes) */

	.amendment ins, .correction ins, .addition ins,
	ins[class^=c] {
		text-decoration-style: dotted;
	}
	.amendment del, .correction del, .addition del,
	del[class^=c] {
		text-decoration-style: dotted;
	}
	.amendment.proposed ins, .correction.proposed ins, .addition.proposed ins,
	ins[class^=c].proposed {
		text-decoration-style: double;
	}
	.amendment.proposed del, .correction.proposed del, .addition.proposed del,
	del[class^=c].proposed {
		text-decoration-style: double;
	}

/** Miscellaneous improvements to inline formatting ***************************/

	sup {
		vertical-align: super;
		font-size: 80%
	}

/******************************************************************************/
/*                                    Code                                    */
/******************************************************************************/

/** General monospace/pre rules ***********************************************/

	pre, code, samp {
		font-family: Menlo, Consolas, "DejaVu Sans Mono", Monaco, monospace;
		font-size: .9em;
		hyphens: none;
		text-transform: none;
		text-align: left;
		text-align: start;
		font-variant: normal;
		orphans: 3;
		widows: 3;
		page-break-before: avoid;
	}
	pre code,
	code code {
		font-size: 100%;
	}

	pre {
		margin-top: 1em;
		margin-bottom: 1em;
		overflow: auto;
	}

/** Inline Code fragments *****************************************************/

	/* Do something nice. */

/******************************************************************************/
/*                                    Links                                   */
/******************************************************************************/

/** General Hyperlinks ********************************************************/

	/* We hyperlink a lot, so make it less intrusive */
	a[href] {
		color: #034575;
		color: var(--a-normal-text);
		text-decoration: underline #707070;
		text-decoration: underline var(--a-normal-underline);
		text-decoration-skip-ink: none;
	}
	a:visited {
		color: #034575;
		color: var(--a-visited-text);
		text-decoration-color: #bbb;
		text-decoration-color: var(--a-visited-underline);
	}

	/* Indicate interaction with the link */
	a[href]:focus,
	a[href]:hover {
		text-decoration-thickness: 2px;
	}
	a[href]:active {
		color: #c00;
		color: var(--a-active-text);
		text-decoration-color: #c00;
		text-decoration-color: var(--a-active-underline);
	}

	/* Backout above styling for W3C logo */
	.head .logo,
	.head .logo a {
		border: none;
		text-decoration: none;
		background: transparent;
	}

/******************************************************************************/
/*                                    Images                                  */
/******************************************************************************/

	img {
		border-style: none;
	}

	img, svg {
		/* Intentionally not color-scheme aware. */
		background: white;
	}

	/* For autogen numbers, add
	  .caption::before, figcaption::before { content: "Figure " counter(figure) ". "; }
	*/

	figure, .figure, .sidefigure {
		page-break-inside: avoid;
		text-align: center;
		margin: 2.5em 0;
	}
	.figure img,	.sidefigure img,	figure img,
	.figure object, .sidefigure object, figure object {
		max-width: 100%;
		margin: auto;
		height: auto;
	}
	.figure pre, .sidefigure pre, figure pre {
		text-align: left;
		display: table;
		margin: 1em auto;
	}
	.figure table, figure table {
		margin: auto;
	}
	@media screen and (min-width: 20em) {
		.sidefigure {
			float: right;
			width: 50%;
			margin: 0 0 0.5em 0.5em;
		}
	}
	.caption, figcaption, caption {
		font-style: italic;
		font-size: 90%;
	}
	.caption::before, figcaption::before, figcaption > .marker {
		font-weight: bold;
	}
	.caption, figcaption {
		counter-increment: figure;
	}

	/* DL list is indented 2em, but figure inside it is not */
	dd > .figure, dd > figure { margin-left: -2em; }

/******************************************************************************/
/*                             Colored Boxes                                  */
/******************************************************************************/

	.issue, .note, .example, .assertion, .advisement, blockquote,
	.amendment, .correction, .addition {
		margin: 1em auto;
		padding: .5em;
		border: .5em;
		border-left-style: solid;
		page-break-inside: avoid;
	}
	span.issue, span.note {
		padding: .1em .5em .15em;
		border-right-style: solid;
	}

	blockquote > :first-child,
	.note  > p:first-child,
	.issue > p:first-child,
	.amendment > p:first-child,
	.correction > p:first-child,
	.addition > p:first-child {
		margin-top: 0;
	}
	blockquote > :last-child,
	.note  > p:last-child,
	.issue > p:last-child,
	.amendment > p:last-child,
	.correction > p:last-child,
	.addition > p:last-child {
		margin-bottom: 0;
	}


	.issue::before, .issue > .marker,
	.example::before, .example > .marker,
	.note::before, .note > .marker,
	details.note > summary > .marker,
	.amendment::before, .amendment > .marker,
	details.amendment > summary > .marker,
	.addition::before, .addition > .marker,
	addition.amendment > summary > .marker,
	.correction::before, .correction > .marker,
	correction.amendment > summary > .marker
	{
		text-transform: uppercase;
		padding-right: 1em;
	}

	.example::before, .example > .marker {
		display: block;
		padding-right: 0em;
	}

/** Blockquotes ***************************************************************/

	blockquote {
		border-color: silver;
		border-color: var(--blockquote-border);
		background: transparent;
		background: var(--blockquote-bg);
		color: currentcolor;
		color: var(--blockquote-text);
	}

/** Open issue ****************************************************************/

	.issue {
		border-color: #e05252;
		border-color: var(--issue-border);
		background: #fbe9e9;
		background: var(--issue-bg);
		color: black;
		color: var(--issue-text);
		counter-increment: issue;
		overflow: auto;
	}
	.issue::before, .issue > .marker {
		color: #831616;
		color: var(--issueheading-text);
	}
	/* Add .issue::before { content: "Issue " counter(issue) " "; } for autogen numbers,
	  or use class="marker" to mark up the issue number in source. */

/** Example *******************************************************************/

	.example {
		border-color: #e0cb52;
		border-color: var(--example-border);
		background: #fcfaee;
		background: var(--example-bg);
		color: black;
		color: var(--example-text);
		counter-increment: example;
		overflow: auto;
		clear: both;
	}
	.example::before, .example > .marker {
		color: #574b0f;
		color: var(--exampleheading-text);
	}
	/* Add .example::before { content: "Example " counter(example) " "; } for autogen numbers,
	  or use class="marker" to mark up the example number in source. */

/** Non-normative Note ********************************************************/

	.note {
		border-color: #52e052;
		border-color: var(--note-border);
		background: #e9fbe9;
		background: var(--note-bg);
		color: black;
		color: var(--note-text);
		overflow: auto;
	}

	.note::before, .note > .marker,
	details.note > summary {
		color: hsl(120, 70%, 30%);
		color: var(--noteheading-text);
	}
	/* Add .note::before { content: "Note "; } for autogen label,
	  or use class="marker" to mark up the label in source. */

	details.note[open] > summary {
		border-bottom: 1px silver solid;
		border-bottom: 1px var(--notesummary-underline) solid;
	}

/** Assertion Box *************************************************************/
	/*  for assertions in algorithms */

	.assertion {
		border-color: #AAA;
		border-color: var(--assertion-border);
		background: #EEE;
		background: var(--assertion-bg);
		color: black;
		color: var(--assertion-text);
	}

/** Advisement Box ************************************************************/
	/*  for attention-grabbing normative statements */

	.advisement {
		border-color: orange;
		border-color: var(--advisement-border);
		border-style: none solid;
		background: #fec;
		background: var(--advisement-bg);
		color: black;
		color: var(--advisement-text);
	}
	strong.advisement {
		display: block;
		text-align: center;
	}
	.advisement::before, .advisement > .marker {
		color: #b35f00;
		color: var(--advisementheading-text);
	}

/** Amendment Box *************************************************************/

	.amendment, .correction, .addition {
		border-color: #330099;
		border-color: var(--amendment-border);
		background: #F5F0FF;
		background: var(--amendment-bg);
		color: black;
		color: var(--amendment-text);
	}
	.amendment.proposed, .correction.proposed, .addition.proposed {
		border-style: solid;
		border-block-width: 0.25em;
	}
	.amendment::before, .amendment > .marker,
	details.amendment > summary::before, details.amendment > summary > .marker,
	.correction::before, .correction > .marker,
	details.correction > summary::before, details.correction > summary > .marker,
	.addition::before, .addition > .marker,
	details.addition > summary::before, details.addition > summary > .marker {
		color: #220066;
		color: var(--amendmentheading-text);
	}
	.amendment.proposed::before, .amendment.proposed > .marker,
	details.amendment.proposed > summary::before, details.amendment.proposed > summary > .marker,
	.correction.proposed::before, .correction.proposed > .marker,
	details.correction.proposed > summary::before, details.correction.proposed > summary > .marker,
	.addition.proposed::before, .addition.proposed > .marker,
	details.addition.proposed > summary::before, details.addition.proposed > summary > .marker {
		font-weight: bold;
	}

/** Spec Obsoletion Notice ****************************************************/
	/* obnoxious obsoletion notice for older/abandoned specs. */

	details {
		display: block;
	}
	summary {
		font-weight: bolder;
	}

	.annoying-warning:not(details),
	details.annoying-warning:not([open]) > summary,
	details.annoying-warning[open] {
		background: hsla(40,100%,50%,0.95);
		background: var(--warning-bg);
		color: black;
		color: var(--warning-text);
		padding: .75em 1em;
		border: red;
		border: var(--warning-border);
		border-style: solid none;
		box-shadow: 0 2px 8px black;
		text-align: center;
	}
	.annoying-warning :last-child {
		margin-bottom: 0;
	}

@media not print {
	details.annoying-warning[open] {
		position: fixed;
		left: 0;
		right: 0;
		bottom: 2em;
		z-index: 1000;
	}
}

	details.annoying-warning:not([open]) > summary {
		text-align: center;
	}

/** Entity Definition Boxes ***************************************************/

	.def {
		padding: .5em 1em;
		background: #def;
		background: var(--def-bg);
		margin: 1.2em 0;
		border-left: 0.5em solid #8ccbf2;
		border-left: 0.5em solid var(--def-border);
		color: black;
		color: var(--def-text);
	}

/******************************************************************************/
/*                                    Tables                                  */
/******************************************************************************/

	th, td {
		text-align: left;
		text-align: start;
	}

/** Property/Descriptor Definition Tables *************************************/

	table.def {
		/* inherits .def box styling, see above */
		width: 100%;
		border-spacing: 0;
	}

	table.def td,
	table.def th {
		padding: 0.5em;
		vertical-align: baseline;
		border-bottom: 1px solid #bbd7e9;
		border-bottom: 1px solid var(--defrow-border);
	}

	table.def > tbody > tr:last-child th,
	table.def > tbody > tr:last-child td {
		border-bottom: 0;
	}

	table.def th {
		font-style: italic;
		font-weight: normal;
		padding-left: 1em;
		width: 3em;
	}

	/* For when values are extra-complex and need formatting for readability */
	table td.pre {
		white-space: pre-wrap;
	}

	/* A footnote at the bottom of a def table */
	table.def td.footnote {
		padding-top: 0.6em;
	}
	table.def td.footnote::before {
		content: " ";
		display: block;
		height: 0.6em;
		width: 4em;
		border-top: thin solid;
	}

/** Data tables (and properly marked-up index tables) *************************/
	/*
		<table class="data"> highlights structural relationships in a table
		when correct markup is used (e.g. thead/tbody, th vs. td, scope attribute)

		Use class="complex data" for particularly complicated tables --
		(This will draw more lines: busier, but clearer.)

		Use class="long" on table cells with paragraph-like contents
		(This will adjust text alignment accordingly.)
		Alternately use class="longlastcol" on tables, to have the last column assume "long".
	*/

	table {
		word-wrap: normal;
		overflow-wrap: normal;
		hyphens: manual;
	}

	table.data,
	table.index {
		margin: 1em auto;
		border-collapse: collapse;
		border: hidden;
		width: 100%;
	}
	table.data caption,
	table.index caption {
		max-width: 50em;
		margin: 0 auto 1em;
	}

	table.data td,  table.data th,
	table.index td, table.index th {
		padding: 0.5em 1em;
		border-width: 1px;
		border-color: silver;
		border-color: var(--datacell-border);
		border-top-style: solid;
	}

	table.data thead td:empty {
		padding: 0;
		border: 0;
	}

	table.data  thead,
	table.index thead,
	table.data  tbody,
	table.index tbody {
		border-bottom: 2px solid;
	}

	table.data colgroup,
	table.index colgroup {
		border-left: 2px solid;
	}

	table.data  tbody th:first-child,
	table.index tbody th:first-child  {
		border-right: 2px solid;
		border-top: 1px solid silver;
		border-top: 1px solid var(--datacell-border);
		padding-right: 1em;
	}

	table.data th[colspan],
	table.data td[colspan] {
		text-align: center;
	}

	table.complex.data th,
	table.complex.data td {
		border: 1px solid silver;
		border: 1px solid var(--datacell-border);
		text-align: center;
	}

	table.data.longlastcol td:last-child,
	table.data td.long {
		vertical-align: baseline;
		text-align: left;
	}

	table.data img {
		vertical-align: middle;
	}


/*
Alternate table alignment rules

	table.data,
	table.index {
		text-align: center;
	}

	table.data  thead th[scope="row"],
	table.index thead th[scope="row"] {
		text-align: right;
	}

	table.data  tbody th:first-child,
	table.index tbody th:first-child  {
		text-align: right;
	}

Possible extra rowspan handling

	table.data  tbody th[rowspan]:not([rowspan='1']),
	table.index tbody th[rowspan]:not([rowspan='1']),
	table.data  tbody td[rowspan]:not([rowspan='1']),
	table.index tbody td[rowspan]:not([rowspan='1']) {
		border-left: 1px solid silver;
	}

	table.data  tbody th[rowspan]:first-child,
	table.index tbody th[rowspan]:first-child,
	table.data  tbody td[rowspan]:first-child,
	table.index tbody td[rowspan]:first-child{
		border-left: 0;
		border-right: 1px solid silver;
	}
*/

/******************************************************************************/
/*                                  Indices                                   */
/******************************************************************************/


/** Table of Contents *********************************************************/

	.toc a {
		/* More spacing; use padding to make it part of the click target. */
		padding: 0.1rem 1px 0;
		/* Larger, more consistently-sized click target */
		display: block;
		/* Switch to using border-bottom for underlines */
		text-decoration: none;
		border-bottom: 1px solid;
		/* Reverse color scheme */
		color: black;
		color: var(--toclink-text);
		border-color: #3980b5;
		border-color: var(--toclink-underline);
	}
	.toc a:visited {
		color: black;
		color: var(--toclink-visited-text);
		border-color: #054572;
		border-color: var(--toclink-visited-underline);
	}
	.toc a:focus,
	.toc a:hover {
		background: rgba(75%, 75%, 75%, .25);
		background: var(--a-hover-bg);
		border-bottom-width: 3px;
		margin-bottom: -2px;
	}
	.toc a:not(:focus):not(:hover) {
		/* Allow colors to cascade through from link styling */
		border-bottom-color: transparent;
	}

	.toc, .toc ol, .toc ul, .toc li {
		list-style: none; /* Numbers must be inlined into source */
		/* because generated content isn't search/selectable and markers can't do multilevel yet */
		margin:  0;
		padding: 0;
	}
	.toc {
		line-height: 1.1em;
	}

	/* ToC not indented until third level, but font style & margins show hierarchy */
	.toc > li			{ font-weight: bold;   }
	.toc > li li		 { font-weight: normal; }
	.toc > li li li	  { font-size:   95%;	}
	.toc > li li li li	{ font-size:   90%;	}
	.toc > li li li li li { font-size:   85%;	}

	/* @supports not (display:grid) { */
		.toc > li			{ margin: 1.5rem 0;	}
		.toc > li li		 { margin: 0.3rem 0;	}
		.toc > li li li	  { margin-left: 2rem;   }

		/* Section numbers in a column of their own */
		.toc .secno {
			float: left;
			width: 4rem;
			white-space: nowrap;
		}
		.toc > li li li li .secno { font-size: 85%; }
		.toc > li li li li li .secno { font-size: 100%; }

		.toc li {
			clear: both;
		}

		:not(li) > .toc			 { margin-left:  5rem; }
		.toc .secno				 { margin-left: -5rem; }
		.toc > li li li .secno	  { margin-left: -7rem; }
		.toc > li li li li .secno	{ margin-left: -9rem; }
		.toc > li li li li li .secno { margin-left: -11rem; }

		/* Tighten up indentation in narrow ToCs */
		@media (max-width: 30em) {
			:not(li) > .toc			 { margin-left:  4rem; }
			.toc .secno				 { margin-left: -4rem; }
			.toc > li li li			 { margin-left:  1rem; }
			.toc > li li li .secno	  { margin-left: -5rem; }
			.toc > li li li li .secno	{ margin-left: -6rem; }
			.toc > li li li li li .secno { margin-left: -7rem; }
		}
		/* Loosen it on wide screens */
		@media screen and (min-width: 78em) {
			body:not(.toc-inline) :not(li) > .toc			 { margin-left:  4rem; }
			body:not(.toc-inline) .toc .secno				 { margin-left: -4rem; }
			body:not(.toc-inline) .toc > li li li			 { margin-left:  1rem; }
			body:not(.toc-inline) .toc > li li li .secno	  { margin-left: -5rem; }
			body:not(.toc-inline) .toc > li li li li .secno	{ margin-left: -6rem; }
			body:not(.toc-inline) .toc > li li li li li .secno { margin-left: -7rem; }
	}
	/* } */

	@supports (display:grid) and (display:contents) {
		/* Use #toc over .toc to override non-@supports rules. */
		#toc {
			display: grid;
			align-content: start;
			grid-template-columns: auto 1fr;
			grid-column-gap: 1rem;
			column-gap: 1rem;
			grid-row-gap: .6rem;
			row-gap: .6rem;
		}
		#toc h2 {
			grid-column: 1 / -1;
			margin-bottom: 0;
		}
		#toc ol,
		#toc li,
		#toc a {
			display: contents;
			/* Switch <a> to subgrid when supported */
		}
		#toc span {
			margin: 0;
		}
		#toc > .toc > li > a > span {
			/* The spans of the top-level list,
			  comprising the first items of each top-level section. */
			margin-top: 1.1rem;
		}
		#toc#toc .secno { /* Ugh, need more specificity to override base.css */
			grid-column: 1;
			width: auto;
			margin-left: 0;
		}
		#toc .content {
			grid-column: 2;
			width: auto;
			margin-right: 1rem;
		}
		#toc .content:hover,
		#toc .content:focus {
			background: rgba(75%, 75%, 75%, .25);
			background: var(--a-hover-bg);
			border-bottom: 3px solid #054572;
			border-bottom: 3px solid var(--toclink-underline);
			margin-bottom: -3px;
		}
		#toc li li li .content {
			margin-left: 1rem;
		}
		#toc li li li li .content {
			margin-left: 2rem;
		}
	}


/** Index *********************************************************************/

	/* Index Lists: Layout */
	ul.index	  { margin-left: 0; columns: 15em; text-indent: 1em hanging; }
	ul.index li	{ margin-left: 0; list-style: none; break-inside: avoid; }
	ul.index li li { margin-left: 1em; }
	ul.index dl	{ margin-top: 0; }
	ul.index dt	{ margin: .2em 0 .2em 20px;}
	ul.index dd	{ margin: .2em 0 .2em 40px;}
	/* Index Lists: Typography */
	ul.index ul,
	ul.index dl { font-size: smaller; }
	@media not print {
		ul.index li span:not(.dfn-paneled) {
			white-space: nowrap;
			color: transparent; }
		ul.index li a:hover + span,
		ul.index li a:focus + span {
			color: #707070;
			color: var(--indexinfo-text);
		}
	}

/** Index Tables *****************************************************/
	/* See also the data table styling section, which this effectively subclasses */

	table.index {
		font-size: small;
		border-collapse: collapse;
		border-spacing: 0;
		text-align: left;
		margin: 1em 0;
	}

	table.index td,
	table.index th {
		padding: 0.4em;
	}

	table.index tr:hover td:not([rowspan]),
	table.index tr:hover th:not([rowspan]) {
		color: black;
		color: var(--indextable-hover-text);
		background: #f7f8f9;
		background: var(--indextable-hover-bg);
	}

	/* The link in the first column in the property table (formerly a TD) */
	table.index th:first-child a {
		font-weight: bold;
	}

/** Outdated warning **********************************************************/

.outdated-spec {
	color: black;
	color: var(--outdatedspec-text);
	background-color: rgba(0,0,0,0.5);
	background-color: var(--outdatedspec-bg);
}

.outdated-warning {
	position: fixed;
	bottom: 50%;
	left: 0;
	right: 0;
	margin: 0 auto;
	width: 50%;
	background: maroon;
	background: var(--outdated-bg);
	color: white;
	color: var(--outdated-text);
	border-radius: 1em;
	box-shadow: 0 0 1em red;
	box-shadow: 0 0 1em var(--outdated-shadow);
	padding: 2em;
	text-align: center;
	z-index: 2;
}

.outdated-warning a {
	color: currentcolor;
	background: transparent;
}

.edited-rec-warning {
	background: darkorange;
	background: var(--editedrec-bg);
	box-shadow: 0 0 1em;
}

.outdated-warning button {
	color: var(--outdated-text);
	border-radius: 1em;
	box-shadow: 0 0 1em red;
	box-shadow: 0 0 1em var(--outdated-shadow);
	padding: 2em;
	text-align: center;
	z-index: 2;
}

.outdated-warning a {
	color: currentcolor;
	background: transparent;
}

.edited-rec-warning {
	background: darkorange;
	background: var(--editedrec-bg);
	box-shadow: 0 0 1em;
}

.outdated-warning button {
	position: absolute;
	top: 0;
	right:0;
	margin: 0;
	border: 0;
	padding: 0.25em 0.5em;
	background: transparent;
	color: white;
	color: var(--outdated-text);
	font:1em sans-serif;
	text-align:center;
}

.outdated-warning span {
	display: block;
}

.outdated-collapsed {
	bottom: 0;
	border-radius: 0;
	width: 100%;
	padding: 0;
}

/******************************************************************************/
/*                                    Print                                   */
/******************************************************************************/

	@media print {
		/* Pages have their own margins. */
		html {
			margin: 0;
		}
		/* Serif for print. */
		body {
			font-family: serif;
		}

		.outdated-warning {
			position: absolute;
			border-style: solid;
			border-color: red;
		}

		.outdated-warning input {
			display: none;
		}
	}
	@page {
		margin: 1.5cm 1.1cm;
	}



/******************************************************************************/
/*                             Overflow Control                               */
/******************************************************************************/

	.figure .caption, .sidefigure .caption, figcaption {
		/* in case figure is overlarge, limit caption to 50em */
		max-width: 50rem;
		margin-left: auto;
		margin-right: auto;
	}
	.overlarge {
		/* Magic to create good item positioning:
		  "content column" is 50ems wide at max; less on smaller screens.
		  Extra space (after ToC + content) is empty on the right.

		  1. When item < content column, centers item in column.
		  2. When content < item < available, left-aligns.
		  3. When item > available, fills available + scroll bar.
		*/
		display: grid;
		grid-template-columns: minmax(0, 50em);
	}
	.overlarge > table {
		/* limit preferred width of table */
		max-width: 50em;
		margin-left: auto;
		margin-right: auto;
	}

	@media (min-width: 55em) {
		.overlarge {
			margin-right: calc(13px + 26.5rem - 50vw);
			max-width: none;
		}
	}
	@media screen and (min-width: 78em) {
		body:not(.toc-inline) .overlarge {
			/* 30.5em body padding 50em content area */
			margin-right: calc(40em - 50vw) !important;
		}
	}
	@media screen and (min-width: 90em) {
		body:not(.toc-inline) .overlarge {
			/* 4em html margin 30.5em body padding 50em content area */
			margin-right: calc(84.5em - 100vw) !important;
		}
	}

	@media not print {
		.overlarge {
			overflow-x: auto;
			/* See Lea Verou's explanation background-attachment:
			* http://lea.verou.me/2012/04/background-attachment-local/
			*
			background: top left  / 4em 100% linear-gradient(to right,  #ffffff, rgba(255, 255, 255, 0)) local,
						top right / 4em 100% linear-gradient(to left, #ffffff, rgba(255, 255, 255, 0)) local,
						top left  / 1em 100% linear-gradient(to right,  #c3c3c5, rgba(195, 195, 197, 0)) scroll,
						top right / 1em 100% linear-gradient(to left, #c3c3c5, rgba(195, 195, 197, 0)) scroll,
						white;
			background-repeat: no-repeat;
			*/
		}
	}
</style>
<style type="text/css">
    table, th, td {
      border: 1px solid black;
      border-collapse: collapse;
      vertical-align: top;
    }
    th, td {
      border-left: none;
      border-right: none;
      padding: 0px 10px;
    }
    th {
      text-align: center;
    }

    del { background: #fcc; color: #000; text-decoration: line-through; }
    ins { background: #cfc; color: #000; }
    blockquote .highlight:not(.idl) { background: initial; margin: initial; padding: 0.5em }
    blockquote ul { background: inherit; }
    blockquote code.highlight:not(.idl) { padding: initial; }
    blockquote c-[a] { color: inherit; } /* Keyword.Declaration */
    blockquote c-[b] { color: inherit; } /* Keyword.Type */
    blockquote c-[c] { color: inherit; } /* Comment */
    blockquote c-[d] { color: inherit; } /* Comment.Multiline */
    blockquote c-[e] { color: inherit; } /* Name.Attribute */
    blockquote c-[f] { color: inherit; } /* Name.Tag */
    blockquote c-[g] { color: inherit; } /* Name.Variable */
    blockquote c-[k] { color: inherit; } /* Keyword */
    blockquote c-[l] { color: inherit; } /* Literal */
    blockquote c-[m] { color: inherit; } /* Literal.Number */
    blockquote c-[n] { color: inherit; } /* Name */
    blockquote c-[o] { color: inherit; } /* Operator */
    blockquote c-[p] { color: inherit; } /* Punctuation */
    blockquote c-[s] { color: inherit; } /* Literal.String */
    blockquote c-[t] { color: inherit; } /* Literal.String.Single */
    blockquote c-[u] { color: inherit; } /* Literal.String.Double */
    blockquote c-[cp] { color: inherit; } /* Comment.Preproc */
    blockquote c-[c1] { color: inherit; } /* Comment.Single */
    blockquote c-[cs] { color: inherit; } /* Comment.Special */
    blockquote c-[kc] { color: inherit; } /* Keyword.Constant */
    blockquote c-[kn] { color: inherit; } /* Keyword.Namespace */
    blockquote c-[kp] { color: inherit; } /* Keyword.Pseudo */
    blockquote c-[kr] { color: inherit; } /* Keyword.Reserved */
    blockquote c-[ld] { color: inherit; } /* Literal.Date */
    blockquote c-[nc] { color: inherit; } /* Name.Class */
    blockquote c-[no] { color: inherit; } /* Name.Constant */
    blockquote c-[nd] { color: inherit; } /* Name.Decorator */
    blockquote c-[ni] { color: inherit; } /* Name.Entity */
    blockquote c-[ne] { color: inherit; } /* Name.Exception */
    blockquote c-[nf] { color: inherit; } /* Name.Function */
    blockquote c-[nl] { color: inherit; } /* Name.Label */
    blockquote c-[nn] { color: inherit; } /* Name.Namespace */
    blockquote c-[py] { color: inherit; } /* Name.Property */
    blockquote c-[ow] { color: inherit; } /* Operator.Word */
    blockquote c-[mb] { color: inherit; } /* Literal.Number.Bin */
    blockquote c-[mf] { color: inherit; } /* Literal.Number.Float */
    blockquote c-[mh] { color: inherit; } /* Literal.Number.Hex */
    blockquote c-[mi] { color: inherit; } /* Literal.Number.Integer */
    blockquote c-[mo] { color: inherit; } /* Literal.Number.Oct */
    blockquote c-[sb] { color: inherit; } /* Literal.String.Backtick */
    blockquote c-[sc] { color: inherit; } /* Literal.String.Char */
    blockquote c-[sd] { color: inherit; } /* Literal.String.Doc */
    blockquote c-[se] { color: inherit; } /* Literal.String.Escape */
    blockquote c-[sh] { color: inherit; } /* Literal.String.Heredoc */
    blockquote c-[si] { color: inherit; } /* Literal.String.Interpol */
    blockquote c-[sx] { color: inherit; } /* Literal.String.Other */
    blockquote c-[sr] { color: inherit; } /* Literal.String.Regex */
    blockquote c-[ss] { color: inherit; } /* Literal.String.Symbol */
    blockquote c-[vc] { color: inherit; } /* Name.Variable.Class */
    blockquote c-[vg] { color: inherit; } /* Name.Variable.Global */
    blockquote c-[vi] { color: inherit; } /* Name.Variable.Instance */
    blockquote c-[il] { color: inherit; } /* Literal.Number.Integer.Long */
  </style>
  <meta content="Bikeshed version a210b7d86, updated Thu Sep 16 13:45:19 2021 -0700" name="generator">
  <link href="https://wg21.link/P2384" rel="canonical">
  <link href="https://isocpp.org/favicon.ico" rel="icon">
<style>
table, th, tr, td {
  border: 2px solid black !important;
}
@media (prefers-color-scheme: dark) {
  table, th, tr, td {
    border: 2px solid white !important;
  }
}
</style>
<style>/* style-autolinks */

.css.css, .property.property, .descriptor.descriptor {
    color: var(--a-normal-text);
    font-size: inherit;
    font-family: inherit;
}
.css::before, .property::before, .descriptor::before {
    content: "‘";
}
.css::after, .property::after, .descriptor::after {
    content: "’";
}
.property, .descriptor {
    /* Don't wrap property and descriptor names */
    white-space: nowrap;
}
.type { /* CSS value <type> */
    font-style: italic;
}
pre .property::before, pre .property::after {
    content: "";
}
[data-link-type="property"]::before,
[data-link-type="propdesc"]::before,
[data-link-type="descriptor"]::before,
[data-link-type="value"]::before,
[data-link-type="function"]::before,
[data-link-type="at-rule"]::before,
[data-link-type="selector"]::before,
[data-link-type="maybe"]::before {
    content: "‘";
}
[data-link-type="property"]::after,
[data-link-type="propdesc"]::after,
[data-link-type="descriptor"]::after,
[data-link-type="value"]::after,
[data-link-type="function"]::after,
[data-link-type="at-rule"]::after,
[data-link-type="selector"]::after,
[data-link-type="maybe"]::after {
    content: "’";
}

[data-link-type].production::before,
[data-link-type].production::after,
.prod [data-link-type]::before,
.prod [data-link-type]::after {
    content: "";
}

[data-link-type=element],
[data-link-type=element-attr] {
    font-family: Menlo, Consolas, "DejaVu Sans Mono", monospace;
    font-size: .9em;
}
[data-link-type=element]::before { content: "<" }
[data-link-type=element]::after  { content: ">" }

[data-link-type=biblio] {
    white-space: pre;
}</style>
<style>/* style-colors */

/* Any --*-text not paired with a --*-bg is assumed to have a transparent bg */
:root {
    color-scheme: light dark;

    --text: black;
    --bg: white;

    --unofficial-watermark: url(https://www.w3.org/StyleSheets/TR/2016/logos/UD-watermark);

    --logo-bg: #1a5e9a;
    --logo-active-bg: #c00;
    --logo-text: white;

    --tocnav-normal-text: #707070;
    --tocnav-normal-bg: var(--bg);
    --tocnav-hover-text: var(--tocnav-normal-text);
    --tocnav-hover-bg: #f8f8f8;
    --tocnav-active-text: #c00;
    --tocnav-active-bg: var(--tocnav-normal-bg);

    --tocsidebar-text: var(--text);
    --tocsidebar-bg: #f7f8f9;
    --tocsidebar-shadow: rgba(0,0,0,.1);
    --tocsidebar-heading-text: hsla(203,20%,40%,.7);

    --toclink-text: var(--text);
    --toclink-underline: #3980b5;
    --toclink-visited-text: var(--toclink-text);
    --toclink-visited-underline: #054572;

    --heading-text: #005a9c;

    --hr-text: var(--text);

    --algo-border: #def;

    --del-text: red;
    --del-bg: transparent;
    --ins-text: #080;
    --ins-bg: transparent;

    --a-normal-text: #034575;
    --a-normal-underline: #bbb;
    --a-visited-text: var(--a-normal-text);
    --a-visited-underline: #707070;
    --a-hover-bg: rgba(75%, 75%, 75%, .25);
    --a-active-text: #c00;
    --a-active-underline: #c00;

    --blockquote-border: silver;
    --blockquote-bg: transparent;
    --blockquote-text: currentcolor;

    --issue-border: #e05252;
    --issue-bg: #fbe9e9;
    --issue-text: var(--text);
    --issueheading-text: #831616;

    --example-border: #e0cb52;
    --example-bg: #fcfaee;
    --example-text: var(--text);
    --exampleheading-text: #574b0f;

    --note-border: #52e052;
    --note-bg: #e9fbe9;
    --note-text: var(--text);
    --noteheading-text: hsl(120, 70%, 30%);
    --notesummary-underline: silver;

    --assertion-border: #aaa;
    --assertion-bg: #eee;
    --assertion-text: black;

    --advisement-border: orange;
    --advisement-bg: #fec;
    --advisement-text: var(--text);
    --advisementheading-text: #b35f00;

    --warning-border: red;
    --warning-bg: hsla(40,100%,50%,0.95);
    --warning-text: var(--text);

    --amendment-border: #330099;
    --amendment-bg: #F5F0FF;
    --amendment-text: var(--text);
    --amendmentheading-text: #220066;

    --def-border: #8ccbf2;
    --def-bg: #def;
    --def-text: var(--text);
    --defrow-border: #bbd7e9;

    --datacell-border: silver;

    --indexinfo-text: #707070;

    --indextable-hover-text: black;
    --indextable-hover-bg: #f7f8f9;

    --outdatedspec-bg: rgba(0, 0, 0, .5);
    --outdatedspec-text: black;
    --outdated-bg: maroon;
    --outdated-text: white;
    --outdated-shadow: red;

    --editedrec-bg: darkorange;
}</style>
<style>/* style-counters */

body {
    counter-reset: example figure issue;
}
.issue {
    counter-increment: issue;
}
.issue:not(.no-marker)::before {
    content: "Issue " counter(issue);
}

.example {
    counter-increment: example;
}
.example:not(.no-marker)::before {
    content: "Example " counter(example);
}
.invalid.example:not(.no-marker)::before,
.illegal.example:not(.no-marker)::before {
    content: "Invalid Example" counter(example);
}

figcaption {
    counter-increment: figure;
}
figcaption:not(.no-marker)::before {
    content: "Figure " counter(figure) " ";
}</style>
<style>/* style-md-lists */

/* This is a weird hack for me not yet following the commonmark spec
   regarding paragraph and lists. */
[data-md] > :first-child {
    margin-top: 0;
}
[data-md] > :last-child {
    margin-bottom: 0;
}</style>
<style>/* style-selflinks */

:root {
    --selflink-text: white;
    --selflink-bg: gray;
    --selflink-hover-text: black;
}
.heading, .issue, .note, .example, li, dt {
    position: relative;
}
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;
}
a.self-link:hover {
    opacity: 1;
}
.heading > a.self-link {
    font-size: 83%;
}
li > a.self-link {
    left: calc(-1 * (3.5rem - 26px) - 2em);
}
dfn > a.self-link {
    top: auto;
    left: auto;
    opacity: 0;
    width: 1.5em;
    height: 1.5em;
    background: var(--selflink-bg);
    color: var(--selflink-text);
    font-style: normal;
    transition: opacity .2s, background-color .2s, color .2s;
}
dfn:hover > a.self-link {
    opacity: 1;
}
dfn > a.self-link:hover {
    color: var(--selflink-hover-text);
}

a.self-link::before            { content: "¶"; }
.heading > a.self-link::before { content: "§"; }
dfn > a.self-link::before      { content: "#"; }
</style>
<style>/* style-darkmode */

@media (prefers-color-scheme: dark) {
    :root {
        --text: #ddd;
        --bg: black;

        --unofficial-watermark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='400' height='400'%3E%3Cg fill='%23100808' transform='translate(200 200) rotate(-45) translate(-200 -200)' stroke='%23100808' stroke-width='3'%3E%3Ctext x='50%25' y='220' style='font: bold 70px sans-serif; text-anchor: middle; letter-spacing: 6px;'%3EUNOFFICIAL%3C/text%3E%3Ctext x='50%25' y='305' style='font: bold 70px sans-serif; text-anchor: middle; letter-spacing: 6px;'%3EDRAFT%3C/text%3E%3C/g%3E%3C/svg%3E");

        --logo-bg: #1a5e9a;
        --logo-active-bg: #c00;
        --logo-text: white;

        --tocnav-normal-text: #999;
        --tocnav-normal-bg: var(--bg);
        --tocnav-hover-text: var(--tocnav-normal-text);
        --tocnav-hover-bg: #080808;
        --tocnav-active-text: #f44;
        --tocnav-active-bg: var(--tocnav-normal-bg);

        --tocsidebar-text: var(--text);
        --tocsidebar-bg: #080808;
        --tocsidebar-shadow: rgba(255,255,255,.1);
        --tocsidebar-heading-text: hsla(203,20%,40%,.7);

        --toclink-text: var(--text);
        --toclink-underline: #6af;
        --toclink-visited-text: var(--toclink-text);
        --toclink-visited-underline: #054572;

        --heading-text: #8af;

        --hr-text: var(--text);

        --algo-border: #456;

        --del-text: #f44;
        --del-bg: transparent;
        --ins-text: #4a4;
        --ins-bg: transparent;

        --a-normal-text: #6af;
        --a-normal-underline: #555;
        --a-visited-text: var(--a-normal-text);
        --a-visited-underline: var(--a-normal-underline);
        --a-hover-bg: rgba(25%, 25%, 25%, .2);
        --a-active-text: #f44;
        --a-active-underline: var(--a-active-text);

        --borderedblock-bg: rgba(255, 255, 255, .05);

        --blockquote-border: silver;
        --blockquote-bg: var(--borderedblock-bg);
        --blockquote-text: currentcolor;

        --issue-border: #e05252;
        --issue-bg: var(--borderedblock-bg);
        --issue-text: var(--text);
        --issueheading-text: hsl(0deg, 70%, 70%);

        --example-border: hsl(50deg, 90%, 60%);
        --example-bg: var(--borderedblock-bg);
        --example-text: var(--text);
        --exampleheading-text: hsl(50deg, 70%, 70%);

        --note-border: hsl(120deg, 100%, 35%);
        --note-bg: var(--borderedblock-bg);
        --note-text: var(--text);
        --noteheading-text: hsl(120, 70%, 70%);
        --notesummary-underline: silver;

        --assertion-border: #444;
        --assertion-bg: var(--borderedblock-bg);
        --assertion-text: var(--text);

        --advisement-border: orange;
        --advisement-bg: #222218;
        --advisement-text: var(--text);
        --advisementheading-text: #f84;

        --warning-border: red;
        --warning-bg: hsla(40,100%,20%,0.95);
        --warning-text: var(--text);

        --amendment-border: #330099;
        --amendment-bg: #080010;
        --amendment-text: var(--text);
        --amendmentheading-text: #cc00ff;

        --def-border: #8ccbf2;
        --def-bg: #080818;
        --def-text: var(--text);
        --defrow-border: #136;

        --datacell-border: silver;

        --indexinfo-text: #aaa;

        --indextable-hover-text: var(--text);
        --indextable-hover-bg: #181818;

        --outdatedspec-bg: rgba(255, 255, 255, .5);
        --outdatedspec-text: black;
        --outdated-bg: maroon;
        --outdated-text: white;
        --outdated-shadow: red;

        --editedrec-bg: darkorange;
    }
    /* In case a transparent-bg image doesn't expect to be on a dark bg,
       which is quite common in practice... */
    img { background: white; }
}
@media (prefers-color-scheme: dark) {
    :root {
        --selflink-text: black;
        --selflink-bg: silver;
        --selflink-hover-text: white;
    }
}

@media (prefers-color-scheme: dark) {
    .highlight:not(.idl) { background: rgba(255, 255, 255, .05); }

    c-[a] { color: #d33682 } /* Keyword.Declaration */
    c-[b] { color: #d33682 } /* Keyword.Type */
    c-[c] { color: #2aa198 } /* Comment */
    c-[d] { color: #2aa198 } /* Comment.Multiline */
    c-[e] { color: #268bd2 } /* Name.Attribute */
    c-[f] { color: #b58900 } /* Name.Tag */
    c-[g] { color: #cb4b16 } /* Name.Variable */
    c-[k] { color: #d33682 } /* Keyword */
    c-[l] { color: #657b83 } /* Literal */
    c-[m] { color: #657b83 } /* Literal.Number */
    c-[n] { color: #268bd2 } /* Name */
    c-[o] { color: #657b83 } /* Operator */
    c-[p] { color: #657b83 } /* Punctuation */
    c-[s] { color: #6c71c4 } /* Literal.String */
    c-[t] { color: #6c71c4 } /* Literal.String.Single */
    c-[u] { color: #6c71c4 } /* Literal.String.Double */
    c-[ch] { color: #2aa198 } /* Comment.Hashbang */
    c-[cp] { color: #2aa198 } /* Comment.Preproc */
    c-[cpf] { color: #2aa198 } /* Comment.PreprocFile */
    c-[c1] { color: #2aa198 } /* Comment.Single */
    c-[cs] { color: #2aa198 } /* Comment.Special */
    c-[kc] { color: #d33682 } /* Keyword.Constant */
    c-[kn] { color: #d33682 } /* Keyword.Namespace */
    c-[kp] { color: #d33682 } /* Keyword.Pseudo */
    c-[kr] { color: #d33682 } /* Keyword.Reserved */
    c-[ld] { color: #657b83 } /* Literal.Date */
    c-[nc] { color: #268bd2 } /* Name.Class */
    c-[no] { color: #268bd2 } /* Name.Constant */
    c-[nd] { color: #268bd2 } /* Name.Decorator */
    c-[ni] { color: #268bd2 } /* Name.Entity */
    c-[ne] { color: #268bd2 } /* Name.Exception */
    c-[nf] { color: #268bd2 } /* Name.Function */
    c-[nl] { color: #268bd2 } /* Name.Label */
    c-[nn] { color: #268bd2 } /* Name.Namespace */
    c-[py] { color: #268bd2 } /* Name.Property */
    c-[ow] { color: #657b83 } /* Operator.Word */
    c-[mb] { color: #657b83 } /* Literal.Number.Bin */
    c-[mf] { color: #657b83 } /* Literal.Number.Float */
    c-[mh] { color: #657b83 } /* Literal.Number.Hex */
    c-[mi] { color: #657b83 } /* Literal.Number.Integer */
    c-[mo] { color: #657b83 } /* Literal.Number.Oct */
    c-[sa] { color: #6c71c4 } /* Literal.String.Affix */
    c-[sb] { color: #6c71c4 } /* Literal.String.Backtick */
    c-[sc] { color: #6c71c4 } /* Literal.String.Char */
    c-[dl] { color: #6c71c4 } /* Literal.String.Delimiter */
    c-[sd] { color: #6c71c4 } /* Literal.String.Doc */
    c-[se] { color: #6c71c4 } /* Literal.String.Escape */
    c-[sh] { color: #6c71c4 } /* Literal.String.Heredoc */
    c-[si] { color: #6c71c4 } /* Literal.String.Interpol */
    c-[sx] { color: #6c71c4 } /* Literal.String.Other */
    c-[sr] { color: #6c71c4 } /* Literal.String.Regex */
    c-[ss] { color: #6c71c4 } /* Literal.String.Symbol */
    c-[fm] { color: #268bd2 } /* Name.Function.Magic */
    c-[vc] { color: #cb4b16 } /* Name.Variable.Class */
    c-[vg] { color: #cb4b16 } /* Name.Variable.Global */
    c-[vi] { color: #cb4b16 } /* Name.Variable.Instance */
    c-[vm] { color: #cb4b16 } /* Name.Variable.Magic */
    c-[il] { color: #657b83 } /* Literal.Number.Integer.Long */
}
</style>
 <body class="h-entry">
  <div class="head">
   <p data-fill-with="logo"></p>
   <h1 class="p-name no-ref" id="title">P2384R1<br>2021 Spring Library Evolution Poll Outcomes</h1>
   <h2 class="no-num no-toc no-ref heading settled" id="profile-and-date"><span class="content">Published Proposal, <time class="dt-updated" datetime="2021-09-25">2021-09-25</time></span></h2>
   <div data-fill-with="spec-metadata">
    <dl>
     <dt class="editor">Author:
     <dd class="editor p-author h-card vcard"><a class="p-name fn u-email email" href="mailto:brycelelbach@gmail.com">Bryce Adelstein Lelbach (he/him/his) — Library Evolution Chair</a> (<span class="p-org org">NVIDIA</span>)
     <dt>Source:
     <dd><a href="https://github.com/brycelelbach/wg21_p2384_2021_spring_library_evolution_poll_outcomes/blob/main/2021_spring_library_evolution_poll_outcomes.bs">GitHub</a>
     <dt>Issue Tracking:
     <dd><a href="https://github.com/brycelelbach/wg21_p2384_2021_spring_library_evolution_poll_outcomes/issues">GitHub</a>
     <dt>Project:
     <dd>ISO/IEC JTC1/SC22/WG21 14882: Programming Language — C++
     <dt>Audience:
     <dd>WG21
    </dl>
   </div>
   <div data-fill-with="warning"></div>
   <hr title="Separator for header">
  </div>
  <nav data-fill-with="table-of-contents" id="toc">
   <h2 class="no-num no-toc no-ref" id="contents">Table of Contents</h2>
   <ol class="toc" role="directory">
    <li><a href="#introduction"><span class="secno">1</span> <span class="content">Introduction</span></a>
    <li><a href="#poll-outcomes"><span class="secno">2</span> <span class="content">Poll Outcomes</span></a>
    <li>
     <a href="#selected-poll-comments"><span class="secno">3</span> <span class="content">Selected Poll Comments</span></a>
     <ol class="toc">
      <li><a href="#poll-1"><span class="secno">3.1</span> <span class="content">Poll 1: <span>[P0323R10]</span> <code class="highlight"><c- n>expected</c-></code></span></a>
      <li><a href="#poll-2"><span class="secno">3.2</span> <span class="content">Poll 2: <span>[P2325R2]</span> Views Should Not Be Required To Be Default Constructible</span></a>
      <li><a href="#poll-3"><span class="secno">3.3</span> <span class="content">Poll 3: <span>[P2328R0]</span> <code class="highlight"><c- n>ranges</c-><c- o>::</c-><c- n>join_view</c-></code> Should Join All Views Of Ranges</span></a>
      <li><a href="#poll-4"><span class="secno">3.4</span> <span class="content">Poll 4: <span>[P2210R2]</span> Superior String Splitting</span></a>
      <li><a href="#poll-5"><span class="secno">3.5</span> <span class="content">Poll 5: <span>[P2321R1]</span> <code class="highlight"><c- n>views</c-><c- o>::</c-><c- n>zip</c-></code></span></a>
      <li><a href="#poll-6"><span class="secno">3.6</span> <span class="content">Poll 6: <span>[P2251R1]</span> Require <code class="highlight"><c- n>span</c-></code> &amp; <code class="highlight"><c- n>basic_string_view</c-></code> To Be Trivially Copyable</span></a>
      <li><a href="#poll-7"><span class="secno">3.7</span> <span class="content">Poll 7: <span>[P1072R7]</span> <code class="highlight"><c- n>basic_string</c-><c- o>::</c-><c- n>resize_and_overwrite</c-></code></span></a>
      <li><a href="#poll-8"><span class="secno">3.8</span> <span class="content">Poll 8: <span>[P2340R0]</span> Clarifying The Status Of The "C Headers"</span></a>
      <li><a href="#poll-9"><span class="secno">3.9</span> <span class="content">Poll 9: <span>[P2301R0]</span> Add A <code class="highlight"><c- n>pmr</c-></code> Alias For <code class="highlight"><c- n>stacktrace</c-></code></span></a>
     </ol>
    <li>
     <a href="#references"><span class="secno"></span> <span class="content">References</span></a>
     <ol class="toc">
      <li><a href="#informative"><span class="secno"></span> <span class="content">Informative References</span></a>
     </ol>
   </ol>
  </nav>
  <main>
   <h2 class="heading settled" data-level="1" id="introduction"><span class="secno">1. </span><span class="content">Introduction</span><a class="self-link" href="#introduction"></a></h2>
   <p>In Spring 2021, the C++ Library Evolution group conducted a series of electronic
  decision polls <a data-link-type="biblio" href="#biblio-p2368r1">[P2368R1]</a>.
This paper provides the results of those polls and summarizes the results.</p>
   <p>In total, 33 people participated in the polls.
Some participants opted to not vote on some polls.
Thank you to everyone who participated, and to the proposal authors for all
  their hard work!</p>
   <h2 class="heading settled" data-level="2" id="poll-outcomes"><span class="secno">2. </span><span class="content">Poll Outcomes</span><a class="self-link" href="#poll-outcomes"></a></h2>
   <ul>
    <li data-md>
     <p>SF: Strongly Favor.</p>
    <li data-md>
     <p>WF: Weakly Favor.</p>
    <li data-md>
     <p>N: Neutral.</p>
    <li data-md>
     <p>WA: Weakly Against.</p>
    <li data-md>
     <p>SA: Strongly Against.</p>
   </ul>
   <table>
    <tbody>
     <tr>
      <th style="padding-bottom: 10px;">Poll 
      <th>SF 
      <th>WF 
      <th>N 
      <th>WA 
      <th>SA 
      <th>Outcome 
     <tr>
      <td style="padding-bottom: 16px;"> Poll 1: Send <a data-link-type="biblio" href="#biblio-p0323r10">[P0323R10]</a> (<code class="highlight"><c- n>expected</c-></code>) to Library Working Group for C++23
  instead of the proposed C++ Library Fundamentals Technical Specification
  version 3, classified as an addition (<a data-link-type="biblio" href="#biblio-p0592r4">[P0592R4]</a> bucket 3 item). 
      <td>11 
      <td>11 
      <td>1 
      <td>2 
      <td>0 
      <td>Consensus in favor. 
     <tr>
      <td style="padding-bottom: 16px;"> Poll 2: Send <a data-link-type="biblio" href="#biblio-p2325r2">[P2325R2]</a> (Views Should Not Be Required To Be Default
  Constructible) to Library Working Group for C++23, classified as an
  improvement of an existing feature (<a data-link-type="biblio" href="#biblio-p0592r4">[P0592R4]</a> bucket 2 item), with the
  recommendation that implementations retroactively apply it to C++20. 
      <td>21 
      <td>7 
      <td>0 
      <td>0 
      <td>0 
      <td>Unanimous consensus in favor. 
     <tr>
      <td style="padding-bottom: 16px;"> Poll 3: Send <a data-link-type="biblio" href="#biblio-p2328r0">[P2328R0]</a> (<code class="highlight"><c- n>ranges</c-><c- o>::</c-><c- n>join_view</c-></code> Should Join All Views Of Ranges)
  to Library Working Group for C++23, classified as an improvement of an existing
  feature (<a data-link-type="biblio" href="#biblio-p0592r4">[P0592R4]</a> bucket 2 item), with the recommendation that
  implementations retroactively apply it to C++20. 
      <td>17 
      <td>8 
      <td>0 
      <td>0 
      <td>0 
      <td>Unanimous consensus in favor. 
     <tr>
      <td style="padding-bottom: 16px;"> Poll 4: Send <a data-link-type="biblio" href="#biblio-p2210r2">[P2210R2]</a> (Superior String Splitting) to Library Working Group
  for C++23, classified as an improvement of an existing feature (<a data-link-type="biblio" href="#biblio-p0592r4">[P0592R4]</a> bucket 2 item), with the recommendation that implementations retroactively
  apply it to C++20. 
      <td>21 
      <td>8 
      <td>0 
      <td>0 
      <td>0 
      <td>Unanimous consensus in favor. 
     <tr>
      <td style="padding-bottom: 16px;"> Poll 5: Send <a data-link-type="biblio" href="#biblio-p2321r1">[P2321R1]</a> (<code class="highlight"><c- n>views</c-><c- o>::</c-><c- n>zip</c-></code>) to Library Working Group for C++23,
  classified as an addition (<a data-link-type="biblio" href="#biblio-p0592r4">[P0592R4]</a> bucket 3 item). 
      <td>19 
      <td>7 
      <td>0 
      <td>1 
      <td>0 
      <td>Consensus in favor. 
     <tr>
      <td style="padding-bottom: 16px;"> Poll 6: Send <a data-link-type="biblio" href="#biblio-p2251r1">[P2251R1]</a> (Require <code class="highlight"><c- n>span</c-></code> &amp; <code class="highlight"><c- n>basic_string_view</c-></code> To Be Trivially
  Copyable) to Library Working Group for C++23, classified as an improvement of
  an existing feature (<a data-link-type="biblio" href="#biblio-p0592r4">[P0592R4]</a> bucket 2 item). 
      <td>21 
      <td>10 
      <td>0 
      <td>0 
      <td>0 
      <td>Unanimous consensus in favor. 
     <tr>
      <td style="padding-bottom: 16px;"> Poll 7: Modify <a data-link-type="biblio" href="#biblio-p1072r7">[P1072R7]</a> (<code class="highlight"><c- n>basic_string</c-><c- o>::</c-><c- n>resize_and_overwrite</c-></code>) by adding a
  feature test macro, and then send the revised paper to Library Working Group
  for C++23, classified as an improvement of an existing feature (<a data-link-type="biblio" href="#biblio-p0592r4">[P0592R4]</a> bucket 2 item). 
      <td>17 
      <td>8 
      <td>0 
      <td>1 
      <td>1 
      <td>Consensus in favor. 
     <tr>
      <td style="padding-bottom: 16px;"> Poll 8: Send <a data-link-type="biblio" href="#biblio-p2340r0">[P2340R0]</a> (Clarifying The Status Of The "C Headers") to Library
  Working Group for C++23, classified as an improvement of an existing feature
  (<a data-link-type="biblio" href="#biblio-p0592r4">[P0592R4]</a> bucket 2 item). 
      <td>13 
      <td>8 
      <td>2 
      <td>0 
      <td>1 
      <td>Consensus in favor. 
     <tr>
      <td style="padding-bottom: 16px;"> Poll 9: Send <a data-link-type="biblio" href="#biblio-p2301r0">[P2301R0]</a> (Add A <code class="highlight"><c- n>pmr</c-></code> Alias For <code class="highlight"><c- n>stacktrace</c-></code>) to Library
  Working Group for C++23, classified as an improvement of an existing feature
  (<a data-link-type="biblio" href="#biblio-p0592r4">[P0592R4]</a> bucket 2 item). 
      <td>6 
      <td>14 
      <td>5 
      <td>0 
      <td>0 
      <td>Strong consensus in favor. 
   </table>
   <h2 class="heading settled" data-level="3" id="selected-poll-comments"><span class="secno">3. </span><span class="content">Selected Poll Comments</span><a class="self-link" href="#selected-poll-comments"></a></h2>
   <h3 class="heading settled" data-level="3.1" id="poll-1"><span class="secno">3.1. </span><span class="content">Poll 1: <a data-link-type="biblio" href="#biblio-p0323r10">[P0323R10]</a> <code class="highlight"><c- n>expected</c-></code></span><a class="self-link" href="#poll-1"></a></h3>
   <blockquote>
    <p>This paper has been under revision by Library Evolution since 2014 and
follows the well-established design of <code class="highlight"><c- n>optional</c-></code>, as Library Evolution asked
the paper authors to do. The paper shows substantial usage with multiple
implementations, and the feedback received tells us that the feature is ready
for production use. A TS will not provide information which we do not already
have.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>I do not believe that TSes with a broad and non-specific focus like the
Library Fundamentals TS serve us well. It’s not clear what we would learn
from the TS. There is a great desire for something like <code class="highlight"><c- n>expected</c-></code>, as
evidenced by the many different forms of it that exist in the wild today.
While there are alternative design decisions, and other approaches, like the
proposed deterministic exception handling (P0709), I do not think we need to
wait. There’s sufficient field experience and demand for this to ship it now.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>C++ needs a good type for expressing error conditions for when exceptions are
not appropriate. Text formatting (P1729) and process management (P1750) could
each benefit significantly from such a type. SG14 has been wanting such a
type for some time.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>I’ve used <code class="highlight"><c- n>tl</c-><c- o>::</c-><c- n>expected</c-></code>, which is based on this paper, in multiple projects
successfully. The community has expressed an inability to use exceptions in
many areas (embedded, games) and efforts to improve exceptions performance,
portability and determinism have yet to go anywhere. It is also very
difficult to use exceptions correctly in asynchronous or parallel code. This
type solve all of these issues, at least to a degree that is much more
reasonable than the status quo.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>Our company has internally had requests for a type that does something along
the lines of this type.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>If we don’t advance this paper and it gets bogged down in further design
review, we’ll just never have it. There were two issues brought up in the
discussion: <code class="highlight"><c- n>expected</c-><c- o>&lt;</c-><c- n>T</c-><c- p>,</c-> <c- n>E</c-><c- o>></c-></code>'s conversion to <code class="highlight"><c- b>bool</c-></code> and <code class="highlight"><c- n>expected</c-><c- o>&lt;</c-><c- n>T</c-><c- p>,</c-> <c- n>E</c-><c- o>></c-></code>'s
comparisons to <code class="highlight"><c- n>T</c-></code>. Both are potentially problematic, though the former at
least has a lot of value while the latter seems like a bug magnet. But the
potential problems with either are surely dwarfed by the value of the
facility as a whole... so we should at least try to ship it... ever.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>We are in dire need of standardized error-or-value type, but there is still a
lot of competing types in the area, and discussion regarding the API. I am
not sure if this design is mature enough to vote it in now.</p>
    <p>— Neutral</p>
   </blockquote>
   <blockquote>
    <p>There have been extended discussions on the design of an <code class="highlight"><c- n>expected</c-></code>-like
facility. I’d prefer to see a trial in a TS instead of going straight to IS.</p>
    <p>— Weakly Against</p>
   </blockquote>
   <blockquote>
    <p>To me this facility doesn’t have common convincing use-cases to be included
in C++ standard. I know that there was  a long discussion and people see the
value of that feature but from my perspective it is not super generic. Basing
on my experience with building the error channel using this facility it was
not very convenient and looks more like the code pollution forcing me to
write <code class="highlight"><c- n>expected</c-></code> everywhere I want error propagation for on the higher level
and then, forcing the user to do the same where the error from my library
should be propagated on higher level of the user code. It’s debatable if
explicit (visible) error channel is better than the hidden one or not. I
don’t want to dive into that holly war now.</p>
    <p>Although, I understand that with <code class="highlight"><c- n>expected</c-></code> we have a combination of the
exact return value and the error and even allow specifying that error type,
to me it’s still looks closer to C approach when we get an error from the
function return value. Also I am concerned that after each call of the
function with <code class="highlight"><c- n>expected</c-></code> return type I should write the if-check if I want to
deal with error. That doesn’t sound like ""Pay as you go"" principle.
Exceptions for example (zero overhead implementation) don’t bring this
requirement and don’t add the overhead unless they are thrown (they do affect
the binary size, but in general I don’t care much). I may test my code in
some situations and make sure exception is never thrown and then don’t write
try-catch at all.</p>
    <p>What I am also afraid of is adding this facility to C++ standard enables one
more orthogonal way to add error channel that should somehow interoperate
with the existing code, which might end up with inconvenient conversions from
one error mechanism to another (e.g. from exceptions to <code class="highlight"><c- n>expected</c-></code> or vice
versa) on different application layers because some libraries start using new
error channel, others continue using exceptions, somebody else invents
another "very fancy" way to notify about the error. And what’s more important
Exceptions remain the primary error channel for C++ standard library that
also might (and eventually, will) add some problems with interoperability and
the mess for the user code. I believe we should move toward unification of
the error channel that works well for all (or almost all) scenarios rather
than introducing one more way for not very large group of use-cases but
definitely increasing the disunity.</p>
    <p>I am (almost 100%) sure that my vote doesn’t change anything but I want to
express my option honestly.</p>
    <p>— Weakly Against</p>
   </blockquote>
   <h3 class="heading settled" data-level="3.2" id="poll-2"><span class="secno">3.2. </span><span class="content">Poll 2: <a data-link-type="biblio" href="#biblio-p2325r2">[P2325R2]</a> Views Should Not Be Required To Be Default Constructible</span><a class="self-link" href="#poll-2"></a></h3>
   <blockquote>
    <p>This fixes a known flaw in ranges in C++20. Luckily, because no
implementation has shipped ranges and the concepts that support them yet, we
have a chance to fix this, and we should take it.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>Requiring Regular turns out to be an overly restrictive requirement,
especially in the face of spans of fixed size which would otherwise be
perfectly good views.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>Adding a default constructor to a class that isn’t naturally default
constructible is, in my opinion, a code smell. The benefit of allowing
non-default constructible things such as <code class="highlight"><c- n>span</c-></code> to be views outweighs the
cost of changing a concept.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>This is a must have because it finally makes all <code class="highlight"><c- n>span</c-></code> views and there is
really no reason to limit the construction of a type in any form.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <h3 class="heading settled" data-level="3.3" id="poll-3"><span class="secno">3.3. </span><span class="content">Poll 3: <a data-link-type="biblio" href="#biblio-p2328r0">[P2328R0]</a> <code class="highlight"><c- n>ranges</c-><c- o>::</c-><c- n>join_view</c-></code> Should Join All Views Of Ranges</span><a class="self-link" href="#poll-3"></a></h3>
   <blockquote>
    <p>This is a better design for <code class="highlight"><c- n>ranges</c-><c- o>::</c-><c- n>join_view</c-></code>, and we are still in the
window when we can likely apply it to C++20.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>It’s good to fix this, especially if we apply those retroactively to existing
implementations.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>I’m convinced this is important. I hope we’re making the right fix and that
our experience with ranges:: is enough.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>I encourage the general direction of loosely interpreting the O(1)
requirements for range operations, but am not expert in this particular
example.</p>
    <p>— Chose to Not Vote</p>
   </blockquote>
   <h3 class="heading settled" data-level="3.4" id="poll-4"><span class="secno">3.4. </span><span class="content">Poll 4: <a data-link-type="biblio" href="#biblio-p2210r2">[P2210R2]</a> Superior String Splitting</span><a class="self-link" href="#poll-4"></a></h3>
   <blockquote>
    <p>The motivation and rationale for this change is convincing. Here in
particular, we gain a split that actually works in practice in an easy-to-use
manner, which is something we’ve been waiting for for decades. The original
design rationale was a fine idea, but we need to be able to make such design
compromises in order to ship a useful split facility.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p><code class="highlight"><c- n>split_view</c-></code> as currently specified is borderline unusable for the most common
use case of splitting strings; this rectifies the problem.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>That strings couldn’t be sensibly split was a defect. Fixing the defect is a
good thing.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>I support the paper, but <code class="highlight"><c- n>lazy_split</c-></code> isn’t a good name. I’ve reached out to
the paper author to bikeshed some names.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <h3 class="heading settled" data-level="3.5" id="poll-5"><span class="secno">3.5. </span><span class="content">Poll 5: <a data-link-type="biblio" href="#biblio-p2321r1">[P2321R1]</a> <code class="highlight"><c- n>views</c-><c- o>::</c-><c- n>zip</c-></code></span><a class="self-link" href="#poll-5"></a></h3>
   <blockquote>
    <p>Probably the most requested view, and it’s impossible to implement in a user
library without the changes to <code class="highlight"><c- n>tuple</c-></code> that this paper makes.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>I support the direction to add <code class="highlight"><c- n>views</c-><c- o>::</c-><c- n>zip</c-></code> to the standard library, because
it’s the most frequent ranges enhancement request I receive from peers.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>I find this feature useful in other programming languages, and would very
much like it in C++ ranges as well.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>This feature is among the most important missing pieces of ranges
functionality. The complexity of the proxy-iterator interface is unfortunate,
but that is not enough to recommend against it.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>Not great to further complicate tuple &amp; pair constructors.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>This paper has open design questions on Library Evolution reflector, that
should be clarified before going to Library. I am not opposed by to having
the paper.</p>
    <p>— Weakly Against</p>
   </blockquote>
   <h3 class="heading settled" data-level="3.6" id="poll-6"><span class="secno">3.6. </span><span class="content">Poll 6: <a data-link-type="biblio" href="#biblio-p2251r1">[P2251R1]</a> Require <code class="highlight"><c- n>span</c-></code> &amp; <code class="highlight"><c- n>basic_string_view</c-></code> To Be Trivially Copyable</span><a class="self-link" href="#poll-6"></a></h3>
   <blockquote>
    <p>These types are deliberately trivial (in the English sense); implementations
have nothing to gain from making them non-trivial (in the C++ sense), and
programmers will derive substantive benefits from the guarantee.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>This is both correct and useful (in particular for computation on GPUs, where
one has to <code class="highlight"><c- n>memcpy</c-></code> spans-of-device-allocations into GPU memory).</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>This is a good thing if ti doesn’t have ABI breaking consequences. I believe
that author did the analysis about ABI stability, so I don’t see the
showstoppers for it to be shipped.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>My only concern is that there may be other types where we strongly imply that
a type is trivially copyable, which was the style of wording to require that
two decades ago, but it seems we are being more specific in new types.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <h3 class="heading settled" data-level="3.7" id="poll-7"><span class="secno">3.7. </span><span class="content">Poll 7: <a data-link-type="biblio" href="#biblio-p1072r7">[P1072R7]</a> <code class="highlight"><c- n>basic_string</c-><c- o>::</c-><c- n>resize_and_overwrite</c-></code></span><a class="self-link" href="#poll-7"></a></h3>
   <blockquote>
    <p>The functionality is useful for performance. The name is consistent with <code class="highlight"><c- n>make_unique_for_overwrite</c-></code>. I wish I had this for <code class="highlight"><c- n>vector</c-></code>, and I’m hopeful
that this will lead to a pattern for containers like <code class="highlight"><c- n>vector</c-></code>.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>This is the best interface given that we want to minimize the window where
the string has uninitialized data (which state adds new preconditions on
various string operations).</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>This is very sharp-knife made for very specific purpose. I think the
interface proposed reflects that property.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>It plugs a performance hole that otherwise drives our users to re-invent
strings or to invoke Undefined Behavior for optimization’s sake.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>This will help with a lot of C interoperability use cases. Adding a feature
test macro seems natural and like something users would expect.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>In a technical sense, this feature weakens the type system in that it
introduces a new, invalid state for <code class="highlight"><c- n>string</c-></code>. However, there are already such
states (e.g., strings that are out of lifetime or that are subject to
concurrent access), and the indirect nature of the interface serves to
reinforce the special nature of the intermediate state and discourage misuse.
That indirection is merely acceptable in terms of teachability, but the
feature is plainly important for performance of real applications.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>The proposed solution is more complex (for the end user more than for the
implementation) than is warranted for the problem that is being solved. I
would rather see the problem remain unsolved than adopt this solution.</p>
    <p>— Weakly Against</p>
   </blockquote>
   <blockquote>
    <p>Undefined behavior if a callback throws is unprecedented. The prior art does
not use this design.</p>
    <p>— Strongly Against</p>
   </blockquote>
   <h3 class="heading settled" data-level="3.8" id="poll-8"><span class="secno">3.8. </span><span class="content">Poll 8: <a data-link-type="biblio" href="#biblio-p2340r0">[P2340R0]</a> Clarifying The Status Of The "C Headers"</span><a class="self-link" href="#poll-8"></a></h3>
   <blockquote>
    <p>This instance of deprecation is plainly causing more harm (in terms of
misunderstanding) than good. The direction chosen, while unavoidably
imprecise, is surely the best option available.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>The line between "style guide" and "descriptive, not prescriptive standard"
is fine. While I fully support this proposal for the C headers, I don’t want
to see it expanded or generalized into a coding standard, because that isn’t
the business the C++ Committee should be in.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>We must face reality: the C headers are not going away...</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>Allowing users to choose to write valid ISO C which is also valid ISO C++
seems useful for maintaining the tight connection/interoperation the two
languages enjoy.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>I’m ambivalent. We keep flip-flopping on whether <code class="highlight"><c- n>stdint</c-><c- p>.</c-><c- n>h</c-></code> vs. <code class="highlight"><c- n>cstdint</c-></code> is
good practice, and I do not know how to feel about it.</p>
    <p>— Neutral</p>
   </blockquote>
   <blockquote>
    <p>C headers where an unfortunate mistake from the beginning. It is as much a
technical issue (these interfaces are terrible, yet some names are very
good), as it is an organizational one (the C++ committee doesn’t control
these headers).</p>
    <p>Un-deprecating them feels like giving up and sends the wrong message. It will
do nothing to dissuade people to use them, quite the contrary, and it does
not give us back the control to modify <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>strlen</c-></code> without an unreasonable
amount of difficulty for a change that would otherwise take a few minutes.</p>
    <p>The guarantees we provide are hardly guarantees we can make, as the C
committee could decide tomorrow to change these interface without consulting
us. As long as there are 2 different bodies taking different votes and
stances on language design, we should try to find a way so that C++ can
evolve in the direction it wants (e.g. making things <code class="highlight"><c- k>constexpr</c-></code> and <code class="highlight"><c- k>noexcept</c-></code> where it make sense notably).</p>
    <p>We should instead entertain documenting in the C++ standard the <code class="highlight"><c- o>&lt;</c-><c- n>cxxx</c-><c- o>></c-></code> headers, so that we have control over the wording, remove the requirements
that these functions have identical addresses as their C counterparts (we
usually don’t support people taking the address of <code class="highlight"><c- n>std</c-><c- o>::</c-></code> functions).</p>
    <p>This paper does not solve any problem.</p>
    <p>— Strongly Against</p>
   </blockquote>
   <h3 class="heading settled" data-level="3.9" id="poll-9"><span class="secno">3.9. </span><span class="content">Poll 9: <a data-link-type="biblio" href="#biblio-p2301r0">[P2301R0]</a> Add A <code class="highlight"><c- n>pmr</c-></code> Alias For <code class="highlight"><c- n>stacktrace</c-></code></span><a class="self-link" href="#poll-9"></a></h3>
   <blockquote>
    <p>To my understanding, such an alias is useful to a group of people and cannot
be created externally to the language. But I would love to see the motivation
in R1.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>It takes longer to write this comment than to review the wording in the
paper. It’s a consistency improvement.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>Unconvinced about the importance of this.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>Meh.</p>
    <p>— Neutral</p>
   </blockquote>
   <blockquote>
    <p>This is a small thing that is super easy to implement. I don’t have
objections, but I am also is not supportive.</p>
    <p>— Neutral</p>
   </blockquote>
   <blockquote>
    <p>While this is "just a convenience", I have not weighed the complexity of any
such extension against the consistency arguments with other <code class="highlight"><c- n>pmr</c-><c- o>::</c-></code> containers.</p>
    <p>— Chose to Not Vote</p>
   </blockquote>
  </main>
<script>
(function() {
  "use strict";
  var collapseSidebarText = '<span aria-hidden="true">←</span> '
                          + '<span>Collapse Sidebar</span>';
  var expandSidebarText   = '<span aria-hidden="true">→</span> '
                          + '<span>Pop Out Sidebar</span>';
  var tocJumpText         = '<span aria-hidden="true">↑</span> '
                          + '<span>Jump to Table of Contents</span>';

  var sidebarMedia = window.matchMedia('screen and (min-width: 78em)');
  var autoToggle   = function(e){ toggleSidebar(e.matches) };
  if(sidebarMedia.addListener) {
    sidebarMedia.addListener(autoToggle);
  }

  function toggleSidebar(on) {
    if (on == undefined) {
      on = !document.body.classList.contains('toc-sidebar');
    }

    /* Don’t scroll to compensate for the ToC if we’re above it already. */
    var headY = 0;
    var head = document.querySelector('.head');
    if (head) {
      // terrible approx of "top of ToC"
      headY += head.offsetTop + head.offsetHeight;
    }
    var skipScroll = window.scrollY < headY;

    var toggle = document.getElementById('toc-toggle');
    var tocNav = document.getElementById('toc');
    if (on) {
      var tocHeight = tocNav.offsetHeight;
      document.body.classList.add('toc-sidebar');
      document.body.classList.remove('toc-inline');
      toggle.innerHTML = collapseSidebarText;
      if (!skipScroll) {
        window.scrollBy(0, 0 - tocHeight);
      }
      tocNav.focus();
      sidebarMedia.addListener(autoToggle); // auto-collapse when out of room
    }
    else {
      document.body.classList.add('toc-inline');
      document.body.classList.remove('toc-sidebar');
      toggle.innerHTML = expandSidebarText;
      if (!skipScroll) {
        window.scrollBy(0, tocNav.offsetHeight);
      }
      if (toggle.matches(':hover')) {
        /* Unfocus button when not using keyboard navigation,
           because I don’t know where else to send the focus. */
        toggle.blur();
      }
    }
  }

  function createSidebarToggle() {
    /* Create the sidebar toggle in JS; it shouldn’t exist when JS is off. */
    var toggle = document.createElement('a');
      /* This should probably be a button, but appearance isn’t standards-track.*/
    toggle.id = 'toc-toggle';
    toggle.class = 'toc-toggle';
    toggle.href = '#toc';
    toggle.innerHTML = collapseSidebarText;

    sidebarMedia.addListener(autoToggle);
    var toggler = function(e) {
      e.preventDefault();
      sidebarMedia.removeListener(autoToggle); // persist explicit off states
      toggleSidebar();
      return false;
    }
    toggle.addEventListener('click', toggler, false);


    /* Get <nav id=toc-nav>, or make it if we don’t have one. */
    var tocNav = document.getElementById('toc-nav');
    if (!tocNav) {
      tocNav = document.createElement('p');
      tocNav.id = 'toc-nav';
      /* Prepend for better keyboard navigation */
      document.body.insertBefore(tocNav, document.body.firstChild);
    }
    /* While we’re at it, make sure we have a Jump to Toc link. */
    var tocJump = document.getElementById('toc-jump');
    if (!tocJump) {
      tocJump = document.createElement('a');
      tocJump.id = 'toc-jump';
      tocJump.href = '#toc';
      tocJump.innerHTML = tocJumpText;
      tocNav.appendChild(tocJump);
    }

    tocNav.appendChild(toggle);
  }

  var toc = document.getElementById('toc');
  if (toc) {
    createSidebarToggle();
    toggleSidebar(sidebarMedia.matches);

    /* If the sidebar has been manually opened and is currently overlaying the text
       (window too small for the MQ to add the margin to body),
       then auto-close the sidebar once you click on something in there. */
    toc.addEventListener('click', function(e) {
      if(e.target.tagName.toLowerCase() == "a" && document.body.classList.contains('toc-sidebar') && !sidebarMedia.matches) {
        toggleSidebar(false);
      }
    }, false);
  }
  else {
    console.warn("Can’t find Table of Contents. Please use <nav id='toc'> around the ToC.");
  }

  /* Wrap tables in case they overflow */
  var tables = document.querySelectorAll(':not(.overlarge) > table.data, :not(.overlarge) > table.index');
  var numTables = tables.length;
  for (var i = 0; i < numTables; i++) {
    var table = tables[i];
    var wrapper = document.createElement('div');
    wrapper.className = 'overlarge';
    table.parentNode.insertBefore(wrapper, table);
    wrapper.appendChild(table);
  }

})();
</script>
  <h2 class="no-num no-ref heading settled" id="references"><span class="content">References</span><a class="self-link" href="#references"></a></h2>
  <h3 class="no-num no-ref heading settled" id="informative"><span class="content">Informative References</span><a class="self-link" href="#informative"></a></h3>
  <dl>
   <dt id="biblio-p0323r10">[P0323R10]
   <dd>JF Bastien, Vicente Botet. <a href="https://wg21.link/p0323r10"><cite>std::expected</cite></a>. 15 April 2021. URL: <a href="https://wg21.link/p0323r10">https://wg21.link/p0323r10</a>
   <dt id="biblio-p0592r4">[P0592R4]
   <dd>Ville Voutilainen. <a href="https://wg21.link/p0592r4"><cite>To boldly suggest an overall plan for C++23</cite></a>. 25 November 2019. URL: <a href="https://wg21.link/p0592r4">https://wg21.link/p0592r4</a>
   <dt id="biblio-p1072r7">[P1072R7]
   <dd>Chris Kennelly, Mark Zeren. <a href="https://wg21.link/p1072r7"><cite>basic_string::resize_and_overwrite</cite></a>. 15 February 2021. URL: <a href="https://wg21.link/p1072r7">https://wg21.link/p1072r7</a>
   <dt id="biblio-p2210r2">[P2210R2]
   <dd>Barry Revzin. <a href="https://wg21.link/p2210r2"><cite>Superior String Splitting</cite></a>. 5 March 2021. URL: <a href="https://wg21.link/p2210r2">https://wg21.link/p2210r2</a>
   <dt id="biblio-p2251r1">[P2251R1]
   <dd>Nevin Liber. <a href="https://wg21.link/p2251r1"><cite>Require span &amp; basic_string_view to be Trivially Copyable</cite></a>. 19 March 2021. URL: <a href="https://wg21.link/p2251r1">https://wg21.link/p2251r1</a>
   <dt id="biblio-p2301r0">[P2301R0]
   <dd>Steve Downey. <a href="https://wg21.link/p2301r0"><cite>Add a pmr alias for std::stacktrace</cite></a>. 15 February 2021. URL: <a href="https://wg21.link/p2301r0">https://wg21.link/p2301r0</a>
   <dt id="biblio-p2321r1">[P2321R1]
   <dd>Tim Song. <a href="https://wg21.link/p2321r1"><cite>zip</cite></a>. 11 April 2021. URL: <a href="https://wg21.link/p2321r1">https://wg21.link/p2321r1</a>
   <dt id="biblio-p2325r2">[P2325R2]
   <dd>Barry Revzin. <a href="https://wg21.link/p2325r2"><cite>Views should not be required to be default constructible</cite></a>. 23 April 2021. URL: <a href="https://wg21.link/p2325r2">https://wg21.link/p2325r2</a>
   <dt id="biblio-p2328r0">[P2328R0]
   <dd>Tim Song. <a href="https://wg21.link/p2328r0"><cite>join_view should join all views of ranges</cite></a>. 15 March 2021. URL: <a href="https://wg21.link/p2328r0">https://wg21.link/p2328r0</a>
   <dt id="biblio-p2340r0">[P2340R0]
   <dd>Thomas Köppe. <a href="https://wg21.link/p2340r0"><cite>Clarifying the status of the ‘C headers’</cite></a>. 15 March 2021. URL: <a href="https://wg21.link/p2340r0">https://wg21.link/p2340r0</a>
   <dt id="biblio-p2368r1">[P2368R1]
   <dd>Bryce Adelstein Lelbach. <a href="https://wg21.link/p2368r1"><cite>2021 Spring Library Evolution Polls</cite></a>. 28 May 2021. URL: <a href="https://wg21.link/p2368r1">https://wg21.link/p2368r1</a>
  </dl>