<!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>P2457R0: 2021 December 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 a + span {
			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 cd66b7b46, updated Thu Jan 13 15:18:25 2022 -0800" name="generator">
  <link href="https://wg21.link/P2457" 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-issues */

a[href].issue-return {
    float: right;
    float: inline-end;
    color: var(--issueheading-text);
    font-weight: bold;
    text-decoration: none;
}
</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">P2457R0<br>2021 December 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="2022-01-14">2022-01-14</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_p2457_2021_december_library_evolution_poll_outcomes/blob/main/2021_december_library_evolution_poll_outcomes.bs">GitHub</a>
     <dt>Issue Tracking:
     <dd><a href="https://github.com/brycelelbach/wg21_p2457_2021_december_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>[P0009R14]</span> <code class="highlight"><c- n>mdspan</c-></code></span></a>
      <li><a href="#poll-2"><span class="secno">3.2</span> <span class="content">Poll 2: <span>[P2093R11]</span> Formatted Output</span></a>
      <li><a href="#poll-3"><span class="secno">3.3</span> <span class="content">Poll 3: <span>[P1467R7]</span> Extended Floating-Point Types</span></a>
      <li><a href="#poll-4"><span class="secno">3.4</span> <span class="content">Poll 4: <span>[P2278R2]</span> <code class="highlight"><c- n>cbegin</c-></code> Should Always Return A Constant Iterator</span></a>
      <li><a href="#poll-5"><span class="secno">3.5</span> <span class="content">Poll 5: <span>[P2408R4]</span> Ranges Iterators As Inputs To Non-Ranges Algorithms</span></a>
      <li><a href="#poll-6"><span class="secno">3.6</span> <span class="content">Poll 6: <span>[P2374R3]</span> <code class="highlight"><c- n>views</c-><c- o>::</c-><c- n>cartesian_product</c-></code></span></a>
      <li><a href="#poll-7"><span class="secno">3.7</span> <span class="content">Poll 7: <span>[P2441R1]</span> <code class="highlight"><c- n>views</c-><c- o>::</c-><c- n>join_with</c-></code></span></a>
      <li><a href="#poll-8"><span class="secno">3.8</span> <span class="content">Poll 8: <span>[P2446R1]</span> <code class="highlight"><c- n>views</c-><c- o>::</c-><c- n>all_move</c-></code></span></a>
      <li><a href="#poll-9"><span class="secno">3.9</span> <span class="content">Poll 9: <span>[P2467R0]</span> Support Exclusive Mode For <code class="highlight"><c- n>fstream</c-></code>s</span></a>
      <li><a href="#poll-10"><span class="secno">3.10</span> <span class="content">Poll 10: <span>[P2438R1]</span> <code class="highlight"><c- n>string</c-><c- o>::</c-><c- n>substr</c-><c- p>()</c-> <c- o>&amp;&amp;</c-></code></span></a>
      <li><a href="#poll-11"><span class="secno">3.11</span> <span class="content">Poll 11: <span>[P2396R0]</span> Concurrency TS v2 Fixes</span></a>
      <li><a href="#poll-12"><span class="secno">3.12</span> <span class="content">Poll 12: <span>[P2198R3]</span> Freestanding Feature-Test Macros And Implementation-Defined Extensions C++23</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 December 2021, the C++ Library Evolution group conducted a series of
  electronic decision polls <a data-link-type="biblio" href="https://wg21.link/p2456r0">[P2456R0]</a>.
This paper provides the results of those polls and summarizes the results.</p>
   <p>In total, 36 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="https://wg21.link/p0009r14">[P0009R14]</a> (<code class="highlight"><c- n>mdspan</c-></code>) to Library Working Group for C++23, classified as an addition (<a data-link-type="biblio" href="https://wg21.link/p0592r4">[P0592R4]</a> bucket 3 item). 
      <td>19 
      <td>9 
      <td>1 
      <td>0 
      <td>0 
      <td>Strong consensus in favor. 
     <tr>
      <td style="padding-bottom: 16px;"> Poll 2: Send <a data-link-type="biblio" href="https://wg21.link/p2093r11">[P2093R11]</a> (Formatted Output) to Library Working Group for C++23, classified as an addition (<a data-link-type="biblio" href="https://wg21.link/p0592r4">[P0592R4]</a> bucket 3 item). 
      <td>18 
      <td>9 
      <td>2 
      <td>0 
      <td>1 
      <td>Consensus in favor. 
     <tr>
      <td style="padding-bottom: 16px;"> Poll 3: Send <a data-link-type="biblio" href="https://wg21.link/p1467r7">[P1467R7]</a> (Extended Floating-Point Types) to Evolution Working Group and Library Working Group for C++23, classified as an addition (<a data-link-type="biblio" href="https://wg21.link/p0592r4">[P0592R4]</a> bucket 3 item). 
      <td>10 
      <td>15 
      <td>0 
      <td>2 
      <td>0 
      <td>Consensus in favor. 
     <tr>
      <td style="padding-bottom: 16px;"> Poll 4: Send <a data-link-type="biblio" href="https://wg21.link/p2278r2">[P2278R2]</a> (<code class="highlight"><c- n>cbegin</c-></code> Should Always Return A Constant Iterator) to Library Working Group for C++23, classified as an improvement of an existing feature (<a data-link-type="biblio" href="https://wg21.link/p0592r4">[P0592R4]</a> bucket 2 item). 
      <td>10 
      <td>12 
      <td>2 
      <td>2 
      <td>0 
      <td>Consensus in favor. 
     <tr>
      <td style="padding-bottom: 16px;"> Poll 5: Send <a data-link-type="biblio" href="https://wg21.link/p2408r4">[P2408R4]</a> (Ranges Iterators As Inputs To Non-Ranges Algorithms) to Library Working Group for C++23, classified as an improvement of an existing feature (<a data-link-type="biblio" href="https://wg21.link/p0592r4">[P0592R4]</a> bucket 2 item). 
      <td>9 
      <td>11 
      <td>2 
      <td>0 
      <td>0 
      <td>Strong consensus in favor. 
     <tr>
      <td style="padding-bottom: 16px;"> Poll 6: Send <a data-link-type="biblio" href="https://wg21.link/p2374r3">[P2374R3]</a> (<code class="highlight"><c- n>views</c-><c- o>::</c-><c- n>cartesian_product</c-></code>) to Library Working Group for C++23, classified as an addition (<a data-link-type="biblio" href="https://wg21.link/p0592r4">[P0592R4]</a> bucket 3 item). 
      <td>14 
      <td>9 
      <td>0 
      <td>2 
      <td>0 
      <td>Consensus in favor. 
     <tr>
      <td style="padding-bottom: 16px;"> Poll 7: Send <a data-link-type="biblio" href="https://wg21.link/p2441r1">[P2441R1]</a> (<code class="highlight"><c- n>views</c-><c- o>::</c-><c- n>join_with</c-></code>) to Library Working Group for C++23, classified as an addition (<a data-link-type="biblio" href="https://wg21.link/p0592r4">[P0592R4]</a> bucket 3 item). 
      <td>12 
      <td>7 
      <td>0 
      <td>1 
      <td>0 
      <td>Consensus in favor. 
     <tr>
      <td style="padding-bottom: 16px;"> Poll 8: Send <a data-link-type="biblio" href="https://wg21.link/p2446r1">[P2446R1]</a> (<code class="highlight"><c- n>views</c-><c- o>::</c-><c- n>all_move</c-></code>) to Library Working Group for C++23, classified as an addition (<a data-link-type="biblio" href="https://wg21.link/p0592r4">[P0592R4]</a> bucket 3 item). 
      <td>9 
      <td>9 
      <td>1 
      <td>3 
      <td>0 
      <td>Consensus in favor. 
     <tr>
      <td style="padding-bottom: 16px;"> Poll 9: Send <a data-link-type="biblio" href="https://wg21.link/p2467r0">[P2467R0]</a> (Support Exclusive Mode For <code class="highlight"><c- n>fstream</c-></code>s) to Library Working Group for C++23, classified as an addition (<a data-link-type="biblio" href="https://wg21.link/p0592r4">[P0592R4]</a> bucket 3 item). 
      <td>13 
      <td>10 
      <td>1 
      <td>0 
      <td>0 
      <td>Strong consensus in favor. 
     <tr>
      <td style="padding-bottom: 16px;"> Poll 10: Send <a data-link-type="biblio" href="https://wg21.link/p2438r1">[P2438R1]</a> (<code class="highlight"><c- n>string</c-><c- o>::</c-><c- n>substr</c-><c- p>()</c-> <c- o>&amp;&amp;</c-></code>) to Library Working Group for C++23, classified as an improvement of an existing feature (<a data-link-type="biblio" href="https://wg21.link/p0592r4">[P0592R4]</a> bucket 2 item). 
      <td>7 
      <td>18 
      <td>1 
      <td>0 
      <td>0 
      <td>Strong consensus in favor. 
     <tr>
      <td style="padding-bottom: 16px;"> Poll 11: Send <a data-link-type="biblio" href="https://wg21.link/p2396r0">[P2396R0]</a> (Concurrency TS v2 Fixes) to Library Working Group for the Concurrency TS v2, classified as an addition (<a data-link-type="biblio" href="https://wg21.link/p0592r4">[P0592R4]</a> bucket 3 item). 
      <td>10 
      <td>12 
      <td>0 
      <td>0 
      <td>0 
      <td>Unanimous consensus in favor. 
     <tr>
      <td style="padding-bottom: 16px;"> Poll 12: Adopt the freestanding feature test macro policy from <a data-link-type="biblio" href="https://wg21.link/p2198r3">[P2198R3]</a> (Freestanding Feature-Test Macros And Implementation-Defined Extensions C++23). 
      <td>8 
      <td>10 
      <td>1 
      <td>2 
      <td>2 
      <td>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="https://wg21.link/p0009r14">[P0009R14]</a> <code class="highlight"><c- n>mdspan</c-></code></span><a class="self-link" href="#poll-1"></a></h3>
   <blockquote>
    <p>Having a multidimensional mapping by itself is very useful, but the additional customization point, allow the usage beyond that. For example, the accessor can be used to make shared- view over arrary.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>While a very basic implementation of this general idea is trivial, having it defined in the standard library supports its use in important applications like the BLAS proposal and also fosters interoperability among numeric components. The additional features of static extents and accessors are less trivial and significantly improve performance in important use cases.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>Time for this to progress. It’s been in work since well before 2017.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>Greatly improved by the addition of multi-parameter operator[].</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>I’ve been following this since Urbana. Much of the early parts of this did not inspire me with confidence, but I suppose the time has finally come.</p>
    <p>— Neutral</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="https://wg21.link/p2093r11">[P2093R11]</a> Formatted Output</span><a class="self-link" href="#poll-2"></a></h3>
   <blockquote>
    <p><code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>print</c-></code> includes all the goodness of <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>format</c-></code>, and lets us output directly, without creating a temporary string. It’s what we should have had a decade or more ago. Please, let’s standardize it and move on with our lives.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>I still have mild concerns about prescribing a behavior for a precondition violation, but I have no doubt this will be one of the most impact-full feature of C++23. This is the right design for users, and importantly, for users of non-English languages. Hello world in C++ finally works.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>I support this proposal as I believe it provides important functionality despite continuing to have reservations regarding it’s use of the literal encoding as a proxy for the determination of the encoding of non-literal text. I also strongly dislike the <code class="highlight"><c- n>vprint_unicode</c-><c- p>()</c-></code> and <code class="highlight"><c- n>vprint_nonunicode</c-><c- p>()</c-></code> names; I think they would be better named <code class="highlight"><c- n>vprint_utf8</c-><c- p>()</c-></code> and <code class="highlight"><c- n>vprint_binary</c-><c- p>()</c-></code> or similar. I am very happy with the decision to treat encoding errors as UB (so that errors can be diagnosed) with normative guidance to substitute replacement characters in error scenarios.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>Baked enough; I continue to have reservations about how baked our format string syntax really is.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>This is a very useful piece of functionality; however, the interaction of the ostream overloads with the iostreams model (e.g., sentry object, exception mask) is unclear and will require additional elaboration.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>The number of defects that had to be fixed in std::format after C++20 shipped makes me cautious here.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>Probably it’s good but if it’s not the part of the standard I don’t think it’s a huge problem</p>
    <p>— Neutral</p>
   </blockquote>
   <blockquote>
    <p>This paper introduces functionality for interacting with a terminal ("If stream refers to a terminal capable of displaying Unicode, ...") that should be accessible on its own with a suitable minimal API and not require use of a large text formatting facility. The user might want to make processing depend on "if a terminal is capable of displaying Unicode" way before actually invoking "print".</p>
    <p>— Strongly Against</p>
   </blockquote>
   <blockquote>
    <p>This proposal is a logical extension of <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>format</c-></code>, which I am generally in favor. But I have not participated enough in this proposals discussion to vote.</p>
    <p>— Did Not Participate</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="https://wg21.link/p1467r7">[P1467R7]</a> Extended Floating-Point Types</span><a class="self-link" href="#poll-3"></a></h3>
   <blockquote>
    <p>This paper represents careful thought by both WG21 and WG14, as well as careful discussion by the C / C++ liaison committee. I participated in a C / C++ liaison committee discussion on this topic, and followed many of the other discussions. I think the authors carefully manage the divergence from C. Some divergence is inevitable. I do like that the authors have decided to keep the C arithmetic conversion rules, both to avoid divergence and to make the types of expressions more clear.</p>
    <p>Regarding Section 5.5.2.1 ("Standard conversion of constants"), my preference would be for C++ to get rid of all such implicit conversions. I don’t mind spelling out the type of a constant. Thus, I think the authors made the right choice.</p>
    <p>Section 5.6 would prevent implementations from supporting mixed-precision arithmetic between two implementation-provided types whose conversion ranks are unordered. However, this would be a weird performance optimization at best. (For correctness, the best thing to do would be to cast everything to a type that can represent both types' sets of values.)  Implementations could provide intrinsics to cover this case, if it’s really needed.</p>
    <p>Regarding Section 5.9, forbidding implicit pointer conversions between pointers to two different floating-point types with the same representation would help make code more portable, because the types might have different representations on some platforms. If code only needs to work on platforms where (for example) double and std::float64_t have the same representation, it can just reinterpret_cast.</p>
    <p>Regarding Section 6.2, I am glad that we are requiring from_chars and to_chars to work for extended floating-point types.</p>
    <p>Regarding Section 7.5, I agree with the authors' position that the new aliases shouldn’t alias the standard types. I wish C++ had done the same thing with int32_t, etc. For example, it’s painful to have to do explicit instantiation of a templated type for both long and long long (or deduce the type of int64_t at build time), when users really want to use the int64_t instantiation.</p>
    <p>Regarding Section 9.2.2 ("Extended floating-point types"), I do agree that we should change or remove the Note. I would still vote SF for this proposal without the change, though.</p>
    <p>I appreciate the drive-by wording corrections ("shall be" -> "is," etc.) in Section 9.2.5.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>Extended floating point units are proliferating in high performance computing and even more so in the machine learning/AI community.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>While, for practical reasons, implementations have avoided using extended integer types, having extended floating-point types is a clearly useful addition given modern hardware support. The library component of the proposal is relatively minor, but has been properly reviewed in light of the core-language changes (especially the question of literal suffixes) and C compatibility issues.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>This seems reasonable to me with the literals being a language feature. The lack of implementation experience is a bit concerning on the language side, however.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>This proposal has no implementation experience, yet it changes overload resolution rules. I deem that unacceptable; we can’t pretend to be able to run overload resolution in our heads.</p>
    <p>— Weakly Against</p>
   </blockquote>
   <blockquote>
    <ol>
     <li data-md>
      <p>Lack of implementation experience, particularly on the to / from chars side</p>
     <li data-md>
      <p>Design is still in flux. You came into LEWG with design questions, and LEWG pushed you in a direction that differed from the paper’s current direction.</p>
     <li data-md>
      <p>I believe reasonable alternatives were raised for how to do streaming formatting with the existing virtual functions, though the text SG would need to weigh in whether such an approach is reasonable.</p>
    </ol>
    <p>— Weakly Against</p>
   </blockquote>
   <blockquote>
    <p>I am glad extended floating point types got some attention and I welcome float16-128. I am slighly sceptical about standardizing bfloat16 though, since it is not an IEEE FP format. But I have not participated in any discussions.</p>
    <p>— Did Not Participate</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="https://wg21.link/p2278r2">[P2278R2]</a> <code class="highlight"><c- n>cbegin</c-></code> Should Always Return A Constant Iterator</span><a class="self-link" href="#poll-4"></a></h3>
   <blockquote>
    <p>This corrects a design mistake in <code class="highlight"><c- n>ranges</c-><c- o>::</c-><c- n>cmeow</c-></code>. Not a fan of the last minute renaming but I can live with it.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>This should be a defect against C++20 and it is a must have to accept C++23 (we should fix major bugs before we add new stuff).</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>Adding members to span looks like going in the completely wrong direction, but the <code class="highlight"><c- n>const_iterator</c-></code>/<code class="highlight"><c- n>all_const</c-></code> view are good additions consistent with the design of ranges.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>My expectation is that <code class="highlight"><c- n>cbegin</c-></code> returns an iterator which can’t be used for modification. It would be surprising to me to use <code class="highlight"><c- n>cbegin</c-></code> and then pass that iterator onwards and allow modifying behavior.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>Several rather different approaches have been considered in this area. This one has the unique virtue of being a new, broadly applicable feature rather than an incomplete compatibility fix for <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>cbegin</c-></code>. The changes to <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>ranges</c-><c- o>::</c-><c- n>cbegin</c-></code> seem much more likely to fix bugs than to introduce them. The new <code class="highlight"><c- n>views</c-><c- o>::</c-><c- n>all_const</c-></code> (whatever we name it) is very natural as a means of avoiding explicit iterators entirely.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>Weakly, because while the facility is important, the name <code class="highlight"><c- n>all_const</c-></code> is terrible. It should be changed to <code class="highlight"><c- n>as_const</c-></code>.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>The facility looks fine; the naming is bad (see <a data-link-type="biblio" href="https://wg21.link/p2501r0">[P2501R0]</a>).</p>
    <p>— Neutral</p>
   </blockquote>
   <blockquote>
    <p>The name "all_const" sinks this proposal for me. See <a data-link-type="biblio" href="https://wg21.link/p2501r0">[P2501R0]</a>.</p>
    <p>— Weakly Against</p>
   </blockquote>
   <blockquote>
    <p>The name should be changed back. I would be in favour of it with the original name.</p>
    <p>— Weakly Against</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="https://wg21.link/p2408r4">[P2408R4]</a> Ranges Iterators As Inputs To Non-Ranges Algorithms</span><a class="self-link" href="#poll-5"></a></h3>
   <blockquote>
    <p>This is a critical change for compatibility of ranges and non-ranges algorithms. In particular, parallel computing in Standard C++ currently depends on the non-ranges standard algorithms. Thus, this paper expands the scope of parallel computing in Standard C++, and lays a foundation for expanding the Standard’s parallel computing features.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>This paper supports proxy iterators, but demotes all of them to <code class="highlight"><c- n>forward_iterator</c-></code> only, so it may block the algorithm from benefiting from stronger access guarantees. The fully rangified algorithms, could provide more benefits. But, I believe blocking this paper, to wait for them, would be the case of "perfect being enemy of good".</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>The imperfect correspondence between C++17 iterator categories and C++20 iterator concepts is a significant conceptual burden. Any improvement to their alignment is welcome even if it is incomplete so long as it is teachable, and "usable as read-only" is certainly that. Bearing in mind that generic functions outside the standard may be written in terms of the non-Ranges algorithms in the standard library, the additional utility (in new code) is even a bit larger than what is described.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>Vague concerns [from an implementer].</p>
    <p>— Neutral</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="https://wg21.link/p2374r3">[P2374R3]</a> <code class="highlight"><c- n>views</c-><c- o>::</c-><c- n>cartesian_product</c-></code></span><a class="self-link" href="#poll-6"></a></h3>
   <blockquote>
    <p>This is an essential component for iterating with ranges and range-for loops over multidimensional index spaces.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p><code class="highlight"><c- n>views</c-><c- o>::</c-><c- n>cartesian_product</c-></code> is particularly important for HPC as it can be used in combination with <code class="highlight"><c- n>views</c-><c- o>::</c-><c- n>iota</c-></code> to express multi-dimensional index iteration.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>My favorite view. Too bad we didn’t go the extra mile to support input iterator as the first parameter. The rest of the design is only logical.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>Nice simple addition to ranges. I had a number of use cases that could benefit from this functionality.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>I do not think this is the highest priority item on the list, but it is technically sound and useful.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>I think that <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>views</c-><c- o>::</c-><c- n>cartesian_product</c-><c- p>()</c-></code> should produce (something equivalent to) <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>views</c-><c- o>::</c-><c- n>single</c-><c- p>(</c-><c- n>std</c-><c- o>::</c-><c- n>tuple</c-><c- o>&lt;></c-><c- p>())</c-></code> rather than <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>views</c-><c- o>::</c-><c- n>empty</c-><c- o>&lt;</c-><c- n>std</c-><c- o>::</c-><c- n>tuple</c-><c- o>&lt;>></c-></code>. See <a href="https://en.wikipedia.org/wiki/Empty_product#Nullary_Cartesian_product">here</a>; the analogy with <code class="highlight"><c- n>zip</c-></code> is flawed because zip is not multiplicative and its special case would naturally be <code class="highlight"><c- n>std</c-><c- o>::::</c-><c- n>ranges</c-><c- o>::</c-><c- n>views</c-><c- o>::</c-><c- n>repeat</c-><c- p>(</c-><c- n>std</c-><c- o>::</c-><c- n>tuple</c-><c- o>&lt;></c-><c- p>())</c-></code> anyway. This could be resolved via an LWG issue or NB comment, but I would prefer that it be rectified in LEWG (and perhaps immediately sent for the last C++23 poll this month).</p>
    <p>— Weakly Against</p>
   </blockquote>
   <blockquote>
    <p>Ranges is such a mess already and anything but existing practice as we design on the fly instead of making the library mature and fix major bugs. This is not how standardization should happen in C++.</p>
    <p>— Weakly Against</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="https://wg21.link/p2441r1">[P2441R1]</a> <code class="highlight"><c- n>views</c-><c- o>::</c-><c- n>join_with</c-></code></span><a class="self-link" href="#poll-7"></a></h3>
   <blockquote>
    <p>This is one of many papers that are helping to make C++ ranges more usable and complete.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>This is an important useful range adaptor that has field experience in 3rd party libraries.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>This is an important and useful range adaptor that has field experience in 3rd party libraries.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>A reasonable addition. I wish there was a way to use multiple elements as a separator but that probably belongs to a different API.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>Before we add more and more stuff to the ranges library, we should make it robust, look whether programmers are using it, and especially fix all major bugs.</p>
    <p>— Weakly Against</p>
   </blockquote>
   <blockquote>
    <p>It’s probably correct as-is, but as it’s a very minor feature, I haven’t taken the time to participate in its discussions.</p>
    <p>— Did Not Participate</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="https://wg21.link/p2446r1">[P2446R1]</a> <code class="highlight"><c- n>views</c-><c- o>::</c-><c- n>all_move</c-></code></span><a class="self-link" href="#poll-8"></a></h3>
   <blockquote>
    <p>This is a useful facility that is hard for users to provide themselves, and since it touches on move semantics it should be in the standard because it allows for more consistent code and makes teaching easier.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>This is one of many papers that are helping to make C++ ranges more usable and complete.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>Remaining conscious of the question of naming, this simple and composable component is ready for wording review and should be approved as a feature even if it’s later altered.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>Weakly, because while the facility is important, the name views::all_move is terrible. It should be changed to views::move.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>The facility looks fine; the naming is bad (see <a data-link-type="biblio" href="https://wg21.link/p2501r0">[P2501R0]</a>).</p>
    <p>— Neutral</p>
   </blockquote>
   <blockquote>
    <p>I can’t vote in favour of this name. I would be in favour of it with the original name.</p>
    <p>— Weakly Against</p>
   </blockquote>
   <blockquote>
    <p>The functionality is useful, but the name is not valid English.</p>
    <p>— Weakly 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="https://wg21.link/p2467r0">[P2467R0]</a> Support Exclusive Mode For <code class="highlight"><c- n>fstream</c-></code>s</span><a class="self-link" href="#poll-9"></a></h3>
   <blockquote>
    <p>This helps make C++ more compatible with C, and exposes a useful feature in C++ (so that users do not need to resort to C in order to get it).</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>I hand-roll this functionality in two different code bases now. Please standardize it.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>To the extent that we care about fstream, this change is long overdue.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>This is not the most common need, but it should be supported.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <h3 class="heading settled" data-level="3.10" id="poll-10"><span class="secno">3.10. </span><span class="content">Poll 10: <a data-link-type="biblio" href="https://wg21.link/p2438r1">[P2438R1]</a> <code class="highlight"><c- n>string</c-><c- o>::</c-><c- n>substr</c-><c- p>()</c-> <c- o>&amp;&amp;</c-></code></span><a class="self-link" href="#poll-10"></a></h3>
   <blockquote>
    <p>This makes it easier to write efficient string manipulation code, and makes such code look more "functional." The authors carefully limit scope to substr, and explain why they didn’t change other functions. They also talk about how to maintain ABI stability.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>Certainly the opportunity to improve the performance of existing code is attractive, and the cases that break are surely rare (except perhaps in certain Hyrum’s-law usage of generic code that uses <code class="highlight"><c- n>forward</c-></code>). However, a disadvantage of such compatibility is that it is possible to have the silent change be to increase memory usage if a small substring is taken of a large rvalue string. Implementations might choose to copy for small size ratios (especially if the starting position is not 0) to avoid this, but they might also hope that clients would use shrink_to_fit in such a case, which old clients would not know to do.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>Through many years of profiling and code reviews I frequently see inefficient code due to the use of <code class="highlight"><c- n>substr</c-></code>. I lean towards banning it in my code, especially when <code class="highlight"><c- n>string_view</c-></code> often the better/right tool. However, there are cases where <code class="highlight"><c- n>string_view</c-></code> cannot be used because of dangling storage and this proposal provides a way to resolve at least some of these cases.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>Good but not sufficiently important.</p>
    <p>— Neutral</p>
   </blockquote>
   <h3 class="heading settled" data-level="3.11" id="poll-11"><span class="secno">3.11. </span><span class="content">Poll 11: <a data-link-type="biblio" href="https://wg21.link/p2396r0">[P2396R0]</a> Concurrency TS v2 Fixes</span><a class="self-link" href="#poll-11"></a></h3>
   <blockquote>
    <p>These are minor fixes that should be uncontroversial.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>These fixes are trivial and obviously correct in direction. Approving the direction will improve implementation consistency even if the paper has not yet been merged into the TS (or the other papers in flight).</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>I don’t like the fine-grained headers for every feature, but the rest of the changes are essential.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <h3 class="heading settled" data-level="3.12" id="poll-12"><span class="secno">3.12. </span><span class="content">Poll 12: <a data-link-type="biblio" href="https://wg21.link/p2198r3">[P2198R3]</a> Freestanding Feature-Test Macros And Implementation-Defined Extensions C++23</span><a class="self-link" href="#poll-12"></a></h3>
   <blockquote>
    <p>Feature test macros are useful for keeping code portable over different compiler versions, but they only work if they do not lie.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>The policy looks good. I like the solution with single macro, that informs is the feature test macro feature is available, given reports that some libraries already properly disable them.</p>
    <p>— Strongly Favor</p>
   </blockquote>
   <blockquote>
    <p>Freestanding users have a need to know what facilities are available in code that might be used in both hosted and freestanding modes, and this gives implementations a way to express that information in a conforming manner.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>This seems reasonable, but implementers' voices are more relevant than mine here.</p>
    <p>— Weakly Favor</p>
   </blockquote>
   <blockquote>
    <p>If this helps people use freestanding, it’s good, but I don’t know enough myself.</p>
    <p>— Neutral</p>
   </blockquote>
   <blockquote>
    <p>I don’t quite understand this poll; R4 of the paper is available, and changes the direction significantly.</p>
    <p>— Weakly Against</p>
   </blockquote>
   <blockquote>
    <p>I object to bumping the values of existing macros. The rationale given for that is flawed. Making the macros optional for freestanding should simply be fixed as a DR for the current standard. The other changes are good, but coupled to unnecessary churn with incorrect rationale.</p>
    <p>— Weakly Against</p>
   </blockquote>
   <blockquote>
    <p>I would prefer to have more granular feature test macros than for code to have to be explicitly written specifically for hosted vs freestanding.</p>
    <p>— Strongly Against</p>
   </blockquote>
   <blockquote>
    <p>Discussion on the reflector has meanwhile revealed that the bulk-bump of the feature test macros is not needed; implementations already do the right thing (and future releases will fix the remaining bugs).</p>
    <p>— Strongly Against</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-p0009r14">[P0009R14]
   <dd>Christian Trott, D.S. Hollman, Damien Lebrun-Grandie, Mark Hoemmen, Daniel Sunderland, H. Carter Edwards, Bryce Adelstein Lelbach, Mauro Bianco, Ben Sander, Athanasios Iliopoulos, John Michopoulos, Nevin Liber. <a href="https://wg21.link/p0009r14"><cite>MDSPAN</cite></a>. 15 November 2021. URL: <a href="https://wg21.link/p0009r14">https://wg21.link/p0009r14</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-p1467r7">[P1467R7]
   <dd>David Olsen, Michał Dominiak, Ilya Burylov. <a href="https://wg21.link/p1467r7"><cite>Extended floating-point types and standard names</cite></a>. 24 November 2021. URL: <a href="https://wg21.link/p1467r7">https://wg21.link/p1467r7</a>
   <dt id="biblio-p2093r11">[P2093R11]
   <dd>Victor Zverovich. <a href="https://wg21.link/p2093r11"><cite>Formatted output</cite></a>. 6 December 2021. URL: <a href="https://wg21.link/p2093r11">https://wg21.link/p2093r11</a>
   <dt id="biblio-p2198r3">[P2198R3]
   <dd>Ben Craig. <a href="https://wg21.link/p2198r3"><cite>Freestanding Feature-Test Macros and Implementation-Defined Extensions</cite></a>. 12 November 2021. URL: <a href="https://wg21.link/p2198r3">https://wg21.link/p2198r3</a>
   <dt id="biblio-p2278r2">[P2278R2]
   <dd>Barry Revzin. <a href="https://wg21.link/p2278r2"><cite>cbegin should always return a constant iterator</cite></a>. 17 November 2021. URL: <a href="https://wg21.link/p2278r2">https://wg21.link/p2278r2</a>
   <dt id="biblio-p2374r3">[P2374R3]
   <dd>Sy Brand, Michał Dominiak. <a href="https://wg21.link/p2374r3"><cite>views::cartesian_product</cite></a>. 13 December 2021. URL: <a href="https://wg21.link/p2374r3">https://wg21.link/p2374r3</a>
   <dt id="biblio-p2396r0">[P2396R0]
   <dd>David Goldblatt. <a href="https://wg21.link/p2396r0"><cite>Concurrency TS 2 fixes</cite></a>. 14 June 2021. URL: <a href="https://wg21.link/p2396r0">https://wg21.link/p2396r0</a>
   <dt id="biblio-p2408r4">[P2408R4]
   <dd>David Olsen. <a href="https://wg21.link/p2408r4"><cite>Ranges iterators as inputs to non-Ranges algorithms</cite></a>. 16 November 2021. URL: <a href="https://wg21.link/p2408r4">https://wg21.link/p2408r4</a>
   <dt id="biblio-p2438r1">[P2438R1]
   <dd>Federico Kircheis, Tomasz Kamiński. <a href="https://wg21.link/p2438r1"><cite>std::string::substr() &amp;&amp;</cite></a>. 20211130. URL: <a href="https://wg21.link/p2438r1">https://wg21.link/p2438r1</a>
   <dt id="biblio-p2441r1">[P2441R1]
   <dd>Barry Revzin. <a href="https://wg21.link/p2441r1"><cite>views::join_with</cite></a>. 17 November 2021. URL: <a href="https://wg21.link/p2441r1">https://wg21.link/p2441r1</a>
   <dt id="biblio-p2446r1">[P2446R1]
   <dd>Barry Revzin. <a href="https://wg21.link/p2446r1"><cite>views::all_move</cite></a>. 17 November 2021. URL: <a href="https://wg21.link/p2446r1">https://wg21.link/p2446r1</a>
   <dt id="biblio-p2456r0">[P2456R0]
   <dd>Bryce Adelstein Lelbach. <a href="https://wg21.link/p2456r0"><cite>2021 December Library Evolution Polls</cite></a>. 8 December 2021. URL: <a href="https://wg21.link/p2456r0">https://wg21.link/p2456r0</a>
   <dt id="biblio-p2467r0">[P2467R0]
   <dd>Jonathan Wakely. <a href="https://wg21.link/p2467r0"><cite>Support exclusive mode for fstreams</cite></a>. 15 November 2021. URL: <a href="https://wg21.link/p2467r0">https://wg21.link/p2467r0</a>
   <dt id="biblio-p2501r0">[P2501R0]
   <dd>Ville Voutilainen. <a href="https://wg21.link/p2501r0"><cite>Undo the rename of views::move and views::as_const</cite></a>. 14 December 2021. URL: <a href="https://wg21.link/p2501r0">https://wg21.link/p2501r0</a>
  </dl>