<!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>P2573R2: = delete("should have a reason");</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;
			border-bottom: 3px solid transparent;
			margin-bottom: -3px;
		}
		#toc .content:hover,
		#toc .content:focus {
			background: rgba(75%, 75%, 75%, .25);
			background: var(--a-hover-bg);
			border-bottom-color: #054572;
			border-bottom-color: var(--toclink-underline);
		}
		#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>
    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 d765c696b, updated Fri Mar 8 15:58:52 2024 -0800" name="generator">
  <link href="https://wg21.link/P2573R2" rel="canonical">
  <link href="https://isocpp.org/favicon.ico" rel="icon">
  <meta content="d7b898df90dcc2a7fd5d2a629f57b4c74f0cba2a" name="revision">
  <meta content="dark light" name="color-scheme">
<style>
table, th, td { border:1px solid grey; }
</style>
<style>/* Boilerplate: 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;
}

@media (prefers-color-scheme: dark) {
    :root {
        --selflink-text: black;
        --selflink-bg: silver;
        --selflink-hover-text: white;
    }
}
</style>
<style>/* Boilerplate: 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;
}

@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; }
}
</style>
<style>/* Boilerplate: 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>/* Boilerplate: style-issues */
a[href].issue-return {
    float: right;
    float: inline-end;
    color: var(--issueheading-text);
    font-weight: bold;
    text-decoration: none;
}
</style>
<style>/* Boilerplate: 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>/* Boilerplate: 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%;
}
.example > a.self-link,
.note > a.self-link,
.issue > a.self-link {
    /* These blocks are overflow:auto, so positioning outside
       doesn't work. */
    left: auto;
    right: 0;
}
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>/* Boilerplate: style-syntax-highlighting */
code.highlight { padding: .1em; border-radius: .3em; }
pre.highlight, pre > code.highlight { display: block; padding: 1em; margin: .5em 0; overflow: auto; border-radius: 0; }

.highlight:not(.idl) { background: rgba(0, 0, 0, .03); }
c-[a] { color: #990055 } /* Keyword.Declaration */
c-[b] { color: #990055 } /* Keyword.Type */
c-[c] { color: #708090 } /* Comment */
c-[d] { color: #708090 } /* Comment.Multiline */
c-[e] { color: #0077aa } /* Name.Attribute */
c-[f] { color: #669900 } /* Name.Tag */
c-[g] { color: #222222 } /* Name.Variable */
c-[k] { color: #990055 } /* Keyword */
c-[l] { color: #000000 } /* Literal */
c-[m] { color: #000000 } /* Literal.Number */
c-[n] { color: #0077aa } /* Name */
c-[o] { color: #999999 } /* Operator */
c-[p] { color: #999999 } /* Punctuation */
c-[s] { color: #a67f59 } /* Literal.String */
c-[t] { color: #a67f59 } /* Literal.String.Single */
c-[u] { color: #a67f59 } /* Literal.String.Double */
c-[cp] { color: #708090 } /* Comment.Preproc */
c-[c1] { color: #708090 } /* Comment.Single */
c-[cs] { color: #708090 } /* Comment.Special */
c-[kc] { color: #990055 } /* Keyword.Constant */
c-[kn] { color: #990055 } /* Keyword.Namespace */
c-[kp] { color: #990055 } /* Keyword.Pseudo */
c-[kr] { color: #990055 } /* Keyword.Reserved */
c-[ld] { color: #000000 } /* Literal.Date */
c-[nc] { color: #0077aa } /* Name.Class */
c-[no] { color: #0077aa } /* Name.Constant */
c-[nd] { color: #0077aa } /* Name.Decorator */
c-[ni] { color: #0077aa } /* Name.Entity */
c-[ne] { color: #0077aa } /* Name.Exception */
c-[nf] { color: #0077aa } /* Name.Function */
c-[nl] { color: #0077aa } /* Name.Label */
c-[nn] { color: #0077aa } /* Name.Namespace */
c-[py] { color: #0077aa } /* Name.Property */
c-[ow] { color: #999999 } /* Operator.Word */
c-[mb] { color: #000000 } /* Literal.Number.Bin */
c-[mf] { color: #000000 } /* Literal.Number.Float */
c-[mh] { color: #000000 } /* Literal.Number.Hex */
c-[mi] { color: #000000 } /* Literal.Number.Integer */
c-[mo] { color: #000000 } /* Literal.Number.Oct */
c-[sb] { color: #a67f59 } /* Literal.String.Backtick */
c-[sc] { color: #a67f59 } /* Literal.String.Char */
c-[sd] { color: #a67f59 } /* Literal.String.Doc */
c-[se] { color: #a67f59 } /* Literal.String.Escape */
c-[sh] { color: #a67f59 } /* Literal.String.Heredoc */
c-[si] { color: #a67f59 } /* Literal.String.Interpol */
c-[sx] { color: #a67f59 } /* Literal.String.Other */
c-[sr] { color: #a67f59 } /* Literal.String.Regex */
c-[ss] { color: #a67f59 } /* Literal.String.Symbol */
c-[vc] { color: #0077aa } /* Name.Variable.Class */
c-[vg] { color: #0077aa } /* Name.Variable.Global */
c-[vi] { color: #0077aa } /* Name.Variable.Instance */
c-[il] { color: #000000 } /* Literal.Number.Integer.Long */

@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">P2573R2<br><code class="highlight"><c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"should have a reason"</c-><c- p>);</c-></code></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="2024-03-22">2024-03-22</time></span></h2>
   <div data-fill-with="spec-metadata">
    <dl>
     <dt>This version:
     <dd><a class="u-url" href="https://wg21.link/P2573R2">https://wg21.link/P2573R2</a>
     <dt class="editor">Author:
     <dd class="editor p-author h-card vcard"><a class="p-name fn u-email email" href="mailto:winmikedows@hotmail.com">Yihe Li</a>
     <dt>Audience:
     <dd>CWG
     <dt>Project:
     <dd>ISO/IEC 14882 Programming Languages — C++, ISO/IEC JTC1/SC22/WG21
     <dt>Target:
     <dd>C++26
     <dt>Source:
     <dd><a href="https://github.com/Mick235711/wg21-papers/blob/main/P2573/P2573R2.bs">github.com/Mick235711/wg21-papers/blob/main/P2573/P2573R2.bs</a>
     <dt>Issue Tracking:
     <dd><a href="https://github.com/Mick235711/wg21-papers/issues">GitHub Mick235711/wg21-papers</a>
    </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="#revisions"><span class="secno">1</span> <span class="content">Revision History</span></a>
     <ol class="toc">
      <li><a href="#r2"><span class="secno">1.1</span> <span class="content">R2</span></a>
      <li><a href="#r1"><span class="secno">1.2</span> <span class="content">R1</span></a>
      <li><a href="#r0"><span class="secno">1.3</span> <span class="content">R0</span></a>
     </ol>
    <li><a href="#motivation"><span class="secno">2</span> <span class="content">Motivation</span></a>
    <li>
     <a href="#usage-examples"><span class="secno">3</span> <span class="content">Usage Example</span></a>
     <ol class="toc">
      <li><a href="#stl-usage"><span class="secno">3.1</span> <span class="content">Standard Library</span></a>
      <li><a href="#other-usage"><span class="secno">3.2</span> <span class="content">Other</span></a>
     </ol>
    <li>
     <a href="#design"><span class="secno">4</span> <span class="content">Design</span></a>
     <ol class="toc">
      <li><a href="#previous-work"><span class="secno">4.1</span> <span class="content">Previous Work</span></a>
      <li><a href="#syntax-semantics"><span class="secno">4.2</span> <span class="content">Syntax and Semantics</span></a>
      <li>
       <a href="#alt-design"><span class="secno">4.3</span> <span class="content">Alternative Design and Issues</span></a>
       <ol class="toc">
        <li><a href="#alt-syntax"><span class="secno">4.3.1</span> <span class="content">Alternative Syntax</span></a>
        <li><a href="#semantics"><span class="secno">4.3.2</span> <span class="content">Overriding Semantics</span></a>
        <li><a href="#unevaluated-strings"><span class="secno">4.3.3</span> <span class="content">Locales and Unevaluated Strings</span></a>
        <li><a href="#claim-of-syntax-space"><span class="secno">4.3.4</span> <span class="content">Claim of Syntax Space</span></a>
       </ol>
      <li><a href="#proposal-scope"><span class="secno">4.4</span> <span class="content">Proposal Scope</span></a>
      <li><a href="#extensions"><span class="secno">4.5</span> <span class="content">Future Extensions</span></a>
      <li><a href="#target-vehicle"><span class="secno">4.6</span> <span class="content">Target Vehicle</span></a>
      <li><a href="#feature-test-macro"><span class="secno">4.7</span> <span class="content">Feature Test Macro</span></a>
     </ol>
    <li><a href="#implementation"><span class="secno">5</span> <span class="content">Implementation Experience</span></a>
    <li>
     <a href="#wording"><span class="secno">6</span> <span class="content">Wording</span></a>
     <ol class="toc">
      <li>
       <a href="#dcl.fct.def"><span class="secno">6.1</span> <span class="content">9.5 Function definitions [dcl.fct.def]</span></a>
       <ol class="toc">
        <li><a href="#dcl.fct.def.general"><span class="secno">6.1.1</span> <span class="content">9.5.1 In general [dcl.fct.def.general]</span></a>
        <li><a href="#dcl.fct.def.delete"><span class="secno">6.1.2</span> <span class="content">9.5.3 Deleted definitions [dcl.fct.def.delete]</span></a>
       </ol>
      <li><a href="#cpp.predefined"><span class="secno">6.2</span> <span class="content">15.11 Predefined macro names [cpp.predefined]</span></a>
     </ol>
    <li>
     <a href="#references"><span class="secno"></span> <span class="content">References</span></a>
     <ol class="toc">
      <li><a href="#normative"><span class="secno"></span> <span class="content">Normative References</span></a>
      <li><a href="#informative"><span class="secno"></span> <span class="content">Informative References</span></a>
     </ol>
   </ol>
  </nav>
  <main>
   <p>C++ had adopted the original <code class="highlight"><c- k>static_assert</c-></code> with message in C++11 by <a data-link-type="biblio" href="#biblio-n1720" title="Proposal to Add Static Assertions to the Core Language (Revision 3)">[N1720]</a>, the <code class="highlight"><c- p>[[</c-><c- n>deprecated</c-><c- p>]]</c-></code> attribute with message in C++14 by <a data-link-type="biblio" href="#biblio-n3760" title="[[deprecated]] attribute">[N3760]</a>,
and the <code class="highlight"><c- p>[[</c-><c- n>nodiscard</c-><c- p>]]</c-></code> attribute with message in C++20 by <a data-link-type="biblio" href="#biblio-p1301r4" title="[[nodiscard(&quot;should have a reason&quot;)]]">[P1301R4]</a>. All of these introductions succeeded in introducing the ability to provide a user-defined message
accompanying the generated diagnostic (warning or error), thus helping to communicate the exact intent and reasoning of the library author and generate more friendly diagnostics.
This paper proposes to take a further step forward, and improve upon the other common and modern way of generating diagnostics, namely using <code class="highlight"><c- o>=</c-> <c- k>delete</c-></code> to delete a function,
by also introducing an optional message component.</p>
   <h2 class="heading settled" data-level="1" id="revisions"><span class="secno">1. </span><span class="content">Revision History</span><a class="self-link" href="#revisions"></a></h2>
   <h3 class="heading settled" data-level="1.1" id="r2"><span class="secno">1.1. </span><span class="content">R2</span><a class="self-link" href="#r2"></a></h3>
   <ul>
    <li data-md>
     <p>Rebase onto <a data-link-type="biblio" href="#biblio-n4971" title="Working Draft, Programming Languages — C++">[N4971]</a>.</p>
    <li data-md>
     <p>Tweaked wording.</p>
    <li data-md>
     <p>As per CWG guidance, changed the feature test macro to be a general one for deleted function.</p>
    <li data-md>
     <p>In Tokyo (2024-03), EWG sees <a data-link-type="biblio" href="#biblio-p2573r1" title="= delete(&quot;should have a reason&quot;);">[P2573R1]</a> and forwarded it to CWG with the following poll:</p>
   </ul>
   <p><strong>Poll:</strong> <a data-link-type="biblio" href="#biblio-p2573r1" title="= delete(&quot;should have a reason&quot;);">[P2573R1]</a> <code class="highlight"><c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"should have a reason"</c-><c- p>);</c-></code> forward to CWG for inclusion in C++26.</p>
   <table>
    <thead>
     <tr>
      <td>SF
      <td>F
      <td>N
      <td>A
      <td>SA
    <tbody>
     <tr>
      <td>1
      <td>11
      <td>4
      <td>0
      <td>0
   </table>
   <p><strong>Outcome:</strong> Consensus 🎉</p>
   <h3 class="heading settled" data-level="1.2" id="r1"><span class="secno">1.2. </span><span class="content">R1</span><a class="self-link" href="#r1"></a></h3>
   <ul>
    <li data-md>
     <p>Retargeted to C++26.</p>
    <li data-md>
     <p>Rebase onto <a data-link-type="biblio" href="#biblio-n4958" title="Working Draft, Programming Languages — C++">[N4958]</a>, which includes <a data-link-type="biblio" href="#biblio-p2361r6" title="Unevaluated strings">[P2361R6]</a> so remove a note for it.</p>
    <li data-md>
     <p>Since <a data-link-type="biblio" href="#biblio-p2741r3" title="user-generated static_assert messages">[P2741R3]</a> had been adopted in Varna (2023-06), add a section for it.</p>
    <li data-md>
     <p>Add previous poll result for <a data-link-type="biblio" href="#biblio-n4186" title="Supporting Custom Diagnostics and SFINAE">[N4186]</a>.</p>
    <li data-md>
     <p>In Kona (2023-11), EWGI sees D2573R1 and forwarded it to EWG with the following poll:</p>
   </ul>
   <p><strong>Poll:</strong> Given the committee’s limited time, EWGI believes P2573R1 is sufficiently developed and motivated to forward to EWG (and mark for LEWG).</p>
   <table>
    <thead>
     <tr>
      <td>SF
      <td>F
      <td>N
      <td>A
      <td>SA
    <tbody>
     <tr>
      <td>4
      <td>4
      <td>3
      <td>0
      <td>0
   </table>
   <p><strong>Outcome:</strong> Consensus 🎉</p>
   <ul>
    <li data-md>
     <p>Add several notes on topics discussed in EWGI meeting.</p>
   </ul>
   <h3 class="heading settled" data-level="1.3" id="r0"><span class="secno">1.3. </span><span class="content">R0</span><a class="self-link" href="#r0"></a></h3>
   <ul>
    <li data-md>
     <p>Initial revision.</p>
   </ul>
   <h2 class="heading settled" data-level="2" id="motivation"><span class="secno">2. </span><span class="content">Motivation</span><a class="self-link" href="#motivation"></a></h2>
   <p>Introduced in C++11, <code class="highlight"><c- o>=</c-> <c- k>default</c-></code> and <code class="highlight"><c- o>=</c-> <c- k>delete</c-></code> had joined <code class="highlight"><c- o>=</c-> <c- mi>0</c-></code> as possible alternative specification for a function body, instead of an ordinary brace-enclosed body of statements.
The original motivation for deleted function declaration via <code class="highlight"><c- o>=</c-> <c- k>delete</c-></code> is to replace (and supersede) the C++98/03-era common practice of declaring special member functions as <code class="highlight"><c- k>private</c-></code> and not define them to disable their automatic generation. However, <code class="highlight"><c- o>=</c-> <c- k>delete</c-></code>’s addition had gained even greater power, for it is permitted to be used for any function, not just special members.
The original paper, <a data-link-type="biblio" href="#biblio-n2346" title="Defaulted and Deleted Functions">[N2346]</a>, described the expected usage of deleted function as:</p>
   <blockquote>
    <p>The primary power of this approach is twofold. First, use of default language facilities can be made an error by deleting the definition of functions that they require. Second, problematic conversions can be made an error by deleting the definition for the offending conversion (or overloaded function).</p>
   </blockquote>
   <p>Looking back at present, ten years after the introduction of deleted functions, we can confidently conclude that <code class="highlight"><c- o>=</c-> <c- k>delete</c-></code> had become one of the key C++11 features that greatly
improved user experience on error usages of library functions and had been a success story of "Modern C++" revolution. We have seen relatively wide adoption both inside the standard library
and in the wider community scope, with over 40k results for <code class="highlight"><c- o>=</c-> <c- k>delete</c-></code> in the <a data-link-type="biblio" href="#biblio-actcd19" title="Andrew&apos;s C/C++ Token Count Dataset 2019">[ACTCD19]</a> database. (Though, admittedly, the feature is still mostly used for member functions, especially its original motivation, disable SMFs.)</p>
   <p>There are several reasons we preferred deleted functions over the traditional <code class="highlight"><c- k>private</c-></code>-but-not-defined ones, including better semantics (<code class="highlight"><c- k>friend</c-></code> and other members are still unaccessible, turning a linker error into a compile-time error),
better diagnostics (instead of cryptic "inaccessible function" errors, the user directly know that the function is deleted), and greater power (not just SMFs).
As we are constantly striving to present a better and friendlier interface to the user of C++, this proposal wants to take the feature a step forward in the "better diagnostics" area:
Instead of an already friendlier but still somewhat cryptic "calling deleted function" error, we directly permit the library authors to present an optional extra message that
should be included in the error message, such that the user will know the exact reasoning of <em>why</em> the function is deleted, and in some cases, <em>which</em> replacement should the user heads to instead.</p>
   <p>In other words, usage of <code class="highlight"><c- o>=</c-> <c- k>delete</c-></code> on a function by the library author practically means that</p>
   <blockquote>
    <p>The library author is saying, "I know what you’re trying to do, and what you’re trying to do is wrong."
(<a href="https://quuxplusone.github.io/blog/2021/10/17/equals-delete-means/">Source</a>)</p>
   </blockquote>
   <p>and after this proposal, my hope is that such usage will mean</p>
   <blockquote>
    <p>The library author is saying, "I know what you’re trying to do, and what you’re trying to do is wrong. <strong>However, I can tell you why I think it is wrong, and I can point you to the right thing to do.</strong>"</p>
   </blockquote>
   <p>The proposed syntax for this feature is (arguably) the "obvious" choice: allow an optional <em>string-literal</em> to be passed as an argument clause to <code class="highlight"><c- o>=</c-> <c- k>delete</c-></code>.
Such a <code class="highlight"><c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"message"</c-><c- p>);</c-></code> clause will be usable whenever the original <code class="highlight"><c- o>=</c-> <c- k>delete</c-><c- p>;</c-></code> clause is usable as a <em>function-body</em>.
Thus the usage will look like this:</p>
<pre class="language-cpp highlight"><c- b>void</c-> <c- nf>newapi</c-><c- p>();</c->
<c- b>void</c-> <c- n>oldapi</c-><c- p>()</c-> <c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"This old API is outdated and already been removed. Please use newapi() instead."</c-><c- p>);</c->

<c- k>template</c-><c- o>&lt;</c-><c- k>typename</c-> <c- nc>T</c-><c- o>></c->
<c- k>struct</c-> <c- nc>A</c-> <c- p>{</c-><c- d>/* ... */</c-><c- p>};</c->
<c- k>template</c-><c- o>&lt;</c-><c- k>typename</c-> <c- nc>T</c-><c- o>></c->
<c- n>A</c-><c- o>&lt;</c-><c- n>T</c-><c- o>></c-> <c- n>factory</c-><c- p>(</c-><c- k>const</c-> <c- n>T</c-><c- o>&amp;</c-><c- p>)</c-> <c- p>{</c-><c- d>/* process lvalue */</c-><c- p>}</c->
<c- k>template</c-><c- o>&lt;</c-><c- k>typename</c-> <c- nc>T</c-><c- o>></c->
<c- n>A</c-><c- o>&lt;</c-><c- n>T</c-><c- o>></c-> <c- n>factory</c-><c- p>(</c-><c- k>const</c-> <c- n>T</c-><c- o>&amp;&amp;</c-><c- p>)</c-> <c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"Using rvalue to construct A may result in dangling reference"</c-><c- p>);</c->

<c- k>struct</c-> <c- nc>MoveOnly</c->
<c- p>{</c->
    <c- c1>// ... (with move members defaulted or defined)</c->
    <c- n>MoveOnly</c-><c- p>(</c-><c- k>const</c-> <c- n>MoveOnly</c-><c- o>&amp;</c-><c- p>)</c-> <c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"Copy-construction is expensive; please use move construction instead."</c-><c- p>);</c->
    <c- n>MoveOnly</c-><c- o>&amp;</c-> <c- k>operator</c-><c- o>=</c-><c- p>(</c-><c- k>const</c-> <c- n>MoveOnly</c-><c- o>&amp;</c-><c- p>)</c-> <c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"Copy-assignment is expensive; please use move assignment instead."</c-><c- p>);</c->
<c- p>};</c->
</pre>
   <p>There is a tony table of how a non-copyable class evolves from C++98 to this proposal, thus introducing the benefits of the proposal and the user-friendliness it brings.
All the examples (except the hypothetical one) are generated by x86-64 clang version 14.0.0 on Compiler Explorer.
The usage client is</p>
<pre class="language-cpp highlight"><c- b>int</c-> <c- nf>main</c-><c- p>()</c->
<c- p>{</c->
    <c- n>NonCopyable</c-> <c- n>nc</c-><c- p>;</c->
    <c- n>NonCopyable</c-> <c- n>nc2</c-> <c- o>=</c-> <c- n>nc</c-><c- p>;</c->
    <c- p>(</c-><c- b>void</c-><c- p>)</c-><c- n>nc2</c-><c- p>;</c->
<c- p>}</c->
</pre>
   <table>
    <thead>
     <tr>
      <td>Standard
      <td>Code
      <td>Diagnostics / Comment
    <tbody>
     <tr>
      <td rowspan="2">C++98
      <td rowspan="2">
<pre class="language-cpp highlight"><c- k>class</c-> <c- nc>NonCopyable</c->
<c- p>{</c->
<c- k>public</c-><c- o>:</c->
    <c- c1>// ...</c->
    <c- n>NonCopyable</c-><c- p>()</c-> <c- p>{}</c->
<c- k>private</c-><c- o>:</c->
    <c- c1>// copy members; no definition</c->
    <c- n>NonCopyable</c-><c- p>(</c-><c- k>const</c-> <c- n>NonCopyable</c-><c- o>&amp;</c-><c- p>);</c->
    <c- n>NonCopyable</c-><c- o>&amp;</c-> <c- k>operator</c-><c- o>=</c-><c- p>(</c-><c- k>const</c-> <c- n>NonCopyable</c-><c- o>&amp;</c-><c- p>);</c->
<c- p>};</c->
</pre>
      <td>
<pre class="language-cpp highlight"><c- o>&lt;</c-><c- n>source</c-><c- o>>:</c-><c- mi>15</c-><c- o>:</c-><c- mi>23</c-><c- o>:</c-> <c- n>error</c-><c- o>:</c-> <c- n>calling</c-> <c- n>a</c->
<c- k>private</c-> <c- n>constructor</c-> <c- n>of</c-> <c- k>class</c-> '<c- n>NonCopyable</c->'
    <c- n>NonCopyable</c-> <c- n>nc2</c-> <c- o>=</c-> <c- n>nc</c-><c- p>;</c->
                      <c- o>^</c->
<c- o>&lt;</c-><c- n>source</c-><c- o>>:</c-><c- mi>8</c-><c- o>:</c-><c- mi>5</c-><c- o>:</c-> <c- n>note</c-><c- o>:</c-> <c- n>declared</c-> <c- k>private</c-> <c- n>here</c->
    <c- n>NonCopyable</c-><c- p>(</c-><c- k>const</c-> <c- n>NonCopyable</c-><c- o>&amp;</c-><c- p>);</c->
    <c- o>^</c->
</pre>
     <tr>
      <td>Average user probably don’t know what "<code class="highlight"><c- k>private</c-></code> constructor" means. Also, <code class="highlight"><c- k>friend</c-></code>/member usage still result in link-time error only.
     <tr>
      <td rowspan="2">C++11 (present)
      <td rowspan="2">
<pre class="language-cpp highlight"><c- k>class</c-> <c- nc>NonCopyable</c->
<c- p>{</c->
<c- k>public</c-><c- o>:</c->
    <c- c1>// ...</c->
    <c- n>NonCopyable</c-><c- p>()</c-> <c- o>=</c-> <c- k>default</c-><c- p>;</c->

    <c- c1>// copy members</c->
    <c- n>NonCopyable</c-><c- p>(</c-><c- k>const</c-> <c- n>NonCopyable</c-><c- o>&amp;</c-><c- p>)</c-> <c- o>=</c-> <c- k>delete</c-><c- p>;</c->
    <c- n>NonCopyable</c-><c- o>&amp;</c-> <c- k>operator</c-><c- o>=</c-><c- p>(</c-><c- k>const</c-> <c- n>NonCopyable</c-><c- o>&amp;</c-><c- p>)</c-> <c- o>=</c-> <c- k>delete</c-><c- p>;</c->
    <c- c1>// maybe provide move members instead</c->
<c- p>};</c->
</pre>
      <td>
<pre class="language-cpp highlight"><c- o>&lt;</c-><c- n>source</c-><c- o>>:</c-><c- mi>16</c-><c- o>:</c-><c- mi>17</c-><c- o>:</c-> <c- n>error</c-><c- o>:</c-> <c- n>call</c-> <c- n>to</c-> <c- n>deleted</c->
<c- n>constructor</c-> <c- n>of</c-> '<c- n>NonCopyable</c->'
    <c- n>NonCopyable</c-> <c- n>nc2</c-> <c- o>=</c-> <c- n>nc</c-><c- p>;</c->
                <c- o>^</c->     <c- o>~~</c->
<c- o>&lt;</c-><c- n>source</c-><c- o>>:</c-><c- mi>8</c-><c- o>:</c-><c- mi>5</c-><c- o>:</c-> <c- n>note</c-><c- o>:</c-> '<c- n>NonCopyable</c->' <c- n>has</c-> <c- n>been</c->
<c- n>explicitly</c-> <c- n>marked</c-> <c- n>deleted</c-> <c- n>here</c->
    <c- n>NonCopyable</c-><c- p>(</c-><c- k>const</c-> <c- n>NonCopyable</c-><c- o>&amp;</c-><c- p>)</c-> <c- o>=</c-> <c- k>delete</c-><c- p>;</c->
    <c- o>^</c->
</pre>
     <tr>
      <td>Great improvement: we can teach "deleted" means "usage is wrong" constantly, and everything is compile-time error. However, still for average user a bit hard to understand and don’t point out what to do instead.
     <tr>
      <td rowspan="2">This proposal
      <td rowspan="2">
<pre class="language-cpp highlight"><c- k>class</c-> <c- nc>NonCopyable</c->
<c- p>{</c->
<c- k>public</c-><c- o>:</c->
    <c- c1>// ...</c->
    <c- n>NonCopyable</c-><c- p>()</c-> <c- o>=</c-> <c- k>default</c-><c- p>;</c->

    <c- c1>// copy members</c->
    <c- n>NonCopyable</c-><c- p>(</c-><c- k>const</c-> <c- n>NonCopyable</c-><c- o>&amp;</c-><c- p>)</c->
        <c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"Since this class manages unique resources, \</c->
<c- s>copy is not supported; use move instead."</c-><c- p>);</c->
    <c- n>NonCopyable</c-><c- o>&amp;</c-> <c- k>operator</c-><c- o>=</c-><c- p>(</c-><c- k>const</c-> <c- n>NonCopyable</c-><c- o>&amp;</c-><c- p>)</c->
        <c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"Since this class manages unique resources, \</c->
<c- s>copy is not supported; use move instead."</c-><c- p>);</c->
    <c- c1>// provide move members instead</c->
<c- p>};</c->
</pre>
      <td>
<pre class="language-cpp highlight"><c- o>&lt;</c-><c- n>source</c-><c- o>>:</c-><c- mi>16</c-><c- o>:</c-><c- mi>17</c-><c- o>:</c-> <c- n>error</c-><c- o>:</c-> <c- n>call</c-> <c- n>to</c-> <c- n>deleted</c->
<c- n>constructor</c-> <c- n>of</c-> '<c- n>NonCopyable</c->'<c- o>:</c-> <c- n>Since</c-> <c- k>this</c-> <c- k>class</c-> <c- nc>manages</c->
<c- n>unique</c-> <c- n>resources</c-><c- p>,</c-> <c- n>copy</c-> <c- n>is</c-> <c- k>not</c-> <c- n>supported</c-><c- p>;</c-> <c- n>use</c-> <c- n>move</c-> <c- n>instead</c-><c- p>.</c->
    <c- n>NonCopyable</c-> <c- n>nc2</c-> <c- o>=</c-> <c- n>nc</c-><c- p>;</c->
                <c- o>^</c->     <c- o>~~</c->
<c- o>&lt;</c-><c- n>source</c-><c- o>>:</c-><c- mi>8</c-><c- o>:</c-><c- mi>5</c-><c- o>:</c-> <c- n>note</c-><c- o>:</c-> '<c- n>NonCopyable</c->' <c- n>has</c-> <c- n>been</c->
<c- n>explicitly</c-> <c- n>marked</c-> <c- n>deleted</c-> <c- n>here</c->
    <c- n>NonCopyable</c-><c- p>(</c-><c- k>const</c-> <c- n>NonCopyable</c-><c- o>&amp;</c-><c- p>)</c->
    <c- o>^</c->
</pre>
     <tr>
      <td>With minimal change, we get a huge boost in user/beginner friendliness, with ability to explain why and what to do instead.
   </table>
    There are some discussion on alternative syntax below. 
   <h2 class="heading settled" data-level="3" id="usage-examples"><span class="secno">3. </span><span class="content">Usage Example</span><a class="self-link" href="#usage-examples"></a></h2>
   <h3 class="heading settled" data-level="3.1" id="stl-usage"><span class="secno">3.1. </span><span class="content">Standard Library</span><a class="self-link" href="#stl-usage"></a></h3>
   <p>This part contains some concrete examples of how current deleted functions in the standard library can benefit from the new message parameter. All examples are based on <a data-link-type="biblio" href="#biblio-n4971" title="Working Draft, Programming Languages — C++">[N4971]</a>.</p>
   <p><strong>Note: As will be discussed below, the standard does not mandate any diagnostic text for deleted functions; a vendor has the freedom (and is encouraged by this proposal)
to implement these messages as non-breaking QoI features.</strong></p>
<pre class="language-cpp highlight"><c- c1>// [unique.ptr.single.general]</c->
<c- k>namespace</c-> <c- nn>std</c-> <c- p>{</c->
    <c- k>template</c-><c- o>&lt;</c-><c- k>class</c-> <c- nc>T</c-><c- p>,</c-> <c- k>class</c-> <c- nc>D</c-> <c- o>=</c-> <c- n>default_delete</c-><c- o>&lt;</c-><c- n>T</c-><c- o>>></c-> <c- k>class</c-> <c- nc>unique_ptr</c-> <c- p>{</c->
    <c- k>public</c-><c- o>:</c->
        <c- c1>// ...</c->
        <c- c1>// disable copy from lvalue</c->
        <c- n>unique_ptr</c-><c- p>(</c-><c- k>const</c-> <c- n>unique_ptr</c-><c- o>&amp;</c-><c- p>)</c-> <c- o>=</c-> <c- k>delete</c-><c- p>(</c->
            <c- s>"unique_ptr&lt;T> resembles unique ownership, so copy is not supported. Use move operations instead."</c-><c- p>);</c->
        <c- n>unique_ptr</c-><c- o>&amp;</c-> <c- k>operator</c-><c- o>=</c-><c- p>(</c-><c- k>const</c-> <c- n>unique_ptr</c-><c- o>&amp;</c-><c- p>)</c-> <c- o>=</c-> <c- k>delete</c-><c- p>(</c->
            <c- s>"unique_ptr&lt;T> resembles unique ownership, so copy is not supported. Use move operations instead."</c-><c- p>);</c->
    <c- p>}</c->
<c- p>}</c->

<c- c1>// [memory.syn]</c->
<c- k>namespace</c-> <c- nn>std</c-> <c- p>{</c->
    <c- c1>// ...</c->
    <c- k>template</c-><c- o>&lt;</c-><c- k>class</c-> <c- nc>T</c-><c- o>></c->
        <c- k>constexpr</c-> <c- n>T</c-><c- o>*</c-> <c- n>addressof</c-><c- p>(</c-><c- n>T</c-><c- o>&amp;</c-> <c- n>r</c-><c- p>)</c-> <c- k>noexcept</c-><c- p>;</c->
    <c- k>template</c-><c- o>&lt;</c-><c- k>class</c-> <c- nc>T</c-><c- o>></c->
        <c- k>const</c-> <c- n>T</c-><c- o>*</c-> <c- n>addressof</c-><c- p>(</c-><c- k>const</c-> <c- n>T</c-><c- o>&amp;&amp;</c-><c- p>)</c-> <c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"Cannot take address of rvalue."</c-><c- p>);</c->

    <c- c1>// ...</c->
    <c- k>template</c-><c- o>&lt;</c-><c- k>class</c-> <c- nc>T</c-><c- p>,</c-> <c- k>class</c-><c- p>...</c-> <c- n>Args</c-><c- o>></c-> <c- c1>// T is not array</c->
        <c- k>constexpr</c-> <c- n>unique_ptr</c-><c- o>&lt;</c-><c- n>T</c-><c- o>></c-> <c- n>make_unique</c-><c- p>(</c-><c- n>Args</c-><c- o>&amp;&amp;</c-><c- p>...</c-> <c- n>args</c-><c- p>);</c->
    <c- k>template</c-><c- o>&lt;</c-><c- k>class</c-> <c- nc>T</c-><c- o>></c-> <c- c1>// T is U[]</c->
        <c- k>constexpr</c-> <c- n>unique_ptr</c-><c- o>&lt;</c-><c- n>T</c-><c- o>></c-> <c- n>make_unique</c-><c- p>(</c-><c- b>size_t</c-> <c- n>n</c-><c- p>);</c->
    <c- k>template</c-><c- o>&lt;</c-><c- k>class</c-> <c- nc>T</c-><c- p>,</c-> <c- k>class</c-><c- p>...</c-> <c- n>Args</c-><c- o>></c-> <c- c1>// T is U[N]</c->
        <c- n>unspecified</c-> <c- n>make_unique</c-><c- p>(</c-><c- n>Args</c-><c- o>&amp;&amp;</c-><c- p>...)</c-> <c- o>=</c-> <c- k>delete</c-><c- p>(</c->
            <c- s>"make_unique&lt;U[N]>(...) is not supported; perhaps you mean make_unique&lt;U[]>(N) instead?"</c-><c- p>);</c->
<c- p>}</c->

<c- c1>// [basic.string.general]</c->
<c- k>namespace</c-> <c- nn>std</c-> <c- p>{</c->
    <c- k>template</c-><c- o>&lt;</c-><c- k>class</c-> <c- nc>charT</c-><c- p>,</c-> <c- k>class</c-> <c- nc>traits</c-> <c- o>=</c-> <c- n>char_traits</c-><c- o>&lt;</c-><c- n>charT</c-><c- o>></c-><c- p>,</c->
             <c- k>class</c-> <c- nc>Allocator</c-> <c- o>=</c-> <c- n>allocator</c-><c- o>&lt;</c-><c- n>charT</c-><c- o>>></c->
    <c- k>class</c-> <c- nc>basic_string</c-> <c- p>{</c->
    <c- k>public</c-><c- o>:</c->
        <c- c1>// ...</c->
        <c- n>basic_string</c-><c- p>(</c-><c- n>nullptr_t</c-><c- p>)</c-> <c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"Construct a string from a null pointer is undefined behavior."</c-><c- p>);</c->
        <c- c1>// ...</c->
        <c- n>basic_string</c-><c- o>&amp;</c-> <c- k>operator</c-><c- o>=</c-><c- p>(</c-><c- n>nullptr_t</c-><c- p>)</c-> <c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"Assignment from a null pointer is undefined behavior."</c-><c- p>);</c->
    <c- p>}</c->
<c- p>}</c->
</pre>
   <h3 class="heading settled" data-level="3.2" id="other-usage"><span class="secno">3.2. </span><span class="content">Other</span><a class="self-link" href="#other-usage"></a></h3>
   <p>A hypothetical usage of new <code class="highlight"><c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"message"</c-><c- p>);</c-></code> that I can foresee to be commonly adopted is to mark the old API
first with <code class="highlight"><c- p>[[</c-><c- n>deprecated</c-><c- p>(</c-><c- s>"reason"</c-><c- p>)]]</c-></code>, and after a few versions, change it to <code class="highlight"><c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"reason"</c-><c- p>);</c-></code>, so that further usage of old API directly results in an error message that
can explain the removal reason and also point towards the new API. Standard library vendors can also do this as a QoI feature through the freedom of zombie names.</p>
   <h2 class="heading settled" data-level="4" id="design"><span class="secno">4. </span><span class="content">Design</span><a class="self-link" href="#design"></a></h2>
   <h3 class="heading settled" data-level="4.1" id="previous-work"><span class="secno">4.1. </span><span class="content">Previous Work</span><a class="self-link" href="#previous-work"></a></h3>
    There have been three previous example of user-customisable error messages presented currently in the C++ standard: 
   <ul>
    <li data-md>
     <p>C++11 <code class="highlight"><c- k>static_assert</c-><c- p>(</c-><c- n>expr</c-><c- p>,</c-> <c- s>"message"</c-><c- p>)</c-></code>, by <a data-link-type="biblio" href="#biblio-n1720" title="Proposal to Add Static Assertions to the Core Language (Revision 3)">[N1720]</a>.</p>
    <li data-md>
     <p>C++14 <code class="highlight"><c- p>[[</c-><c- n>deprecated</c-><c- p>(</c-><c- s>"with reason"</c-><c- p>)]]</c-></code>, by <a data-link-type="biblio" href="#biblio-n3760" title="[[deprecated]] attribute">[N3760]</a>.</p>
    <li data-md>
     <p>C++20 <code class="highlight"><c- p>[[</c-><c- n>nodiscard</c-><c- p>(</c-><c- s>"with reason"</c-><c- p>)]]</c-></code>, by <a data-link-type="biblio" href="#biblio-p1301r4" title="[[nodiscard(&quot;should have a reason&quot;)]]">[P1301R4]</a>.</p>
   </ul>
   <p>This proposal naturally fits in the same category of providing reasons/friendly messages alongside the original diagnostics and can use a lot of the existing wordings.</p>
   <p>A previous proposal, <a data-link-type="biblio" href="#biblio-n4186" title="Supporting Custom Diagnostics and SFINAE">[N4186]</a>, proposed the exactly same thing, and is received favorably by EWG in Urbana (2014-11) (see <a data-link-type="biblio" href="#biblio-ewg152" title="N4186 Supporting Custom Diagnostics and SFINAE">[EWG152]</a>):</p>
   <blockquote>
    <p><strong>Poll:</strong> Is this a problem worth solving?</p>
    <table>
     <thead>
      <tr>
       <td>SF
       <td>F
       <td>N
       <td>A
       <td>SA
     <tbody>
      <tr>
       <td>13
       <td>5
       <td>1
       <td>3
       <td>2
    </table>
   </blockquote>
   <p>However, there is no further progress on that proposal, and
thus this proposal aims to continue the work in this direction.</p>
   <h3 class="heading settled" data-level="4.2" id="syntax-semantics"><span class="secno">4.2. </span><span class="content">Syntax and Semantics</span><a class="self-link" href="#syntax-semantics"></a></h3>
    The syntax I prefer is <code class="highlight"><c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"with reason"</c-><c- p>);</c-></code>, in other words, an optional argument clause after the <code class="highlight"><c- k>delete</c-></code> keyword where the only argument allowed is a single <em>string-literal</em>. 
   <p>The semantics will be entirely identical to regular <code class="highlight"><c- o>=</c-> <c- k>delete</c-><c- p>;</c-></code>, which means that the new form can be exchanged freely with the old form, with the only difference being the diagnostic message.
Some additional semantics caveat is discussed in the Overriding Semantics section below.</p>
   <h3 class="heading settled" data-level="4.3" id="alt-design"><span class="secno">4.3. </span><span class="content">Alternative Design and Issues</span><a class="self-link" href="#alt-design"></a></h3>
    This section lists the alternative design choices and possible arguments against this proposal that have been considered. 
   <h4 class="heading settled" data-level="4.3.1" id="alt-syntax"><span class="secno">4.3.1. </span><span class="content">Alternative Syntax</span><a class="self-link" href="#alt-syntax"></a></h4>
    A previous proposal <a data-link-type="biblio" href="#biblio-p1267r0" title="Custom Constraint Diagnostics">[P1267R0]</a> proposed a <code class="highlight"><c- p>[[</c-><c- n>reason_not_used</c-><c- p>(</c-><c- s>"reason"</c-><c- p>)]]</c-></code> attribute to enhance the compiler error in SFINAE failure cases.
While the motivation is similar, the problem it solved is slightly different as <code class="highlight"><c- o>=</c-> <c- k>delete</c-></code> in general does not affect overload resolution.
In its "Future Directions" section, however, a series of <code class="highlight"><c- p>[[</c-><c- n>reason_xxx</c-><c- p>]]</c-></code> attributes were described, with the <code class="highlight"><c- p>[[</c-><c- n>reason_deleted</c-><c- p>(</c-><c- s>"reason"</c-><c- p>)]]</c-></code> described will have identical semantics with what this proposal proposes. This proposal proposes: 
<pre class="language-cpp highlight"><c- b>void</c-> <c- n>fun</c-><c- p>()</c-> <c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"my reason"</c-><c- p>);</c->
</pre>
   <p>which in future-<a data-link-type="biblio" href="#biblio-p1267r0" title="Custom Constraint Diagnostics">[P1267R0]</a> world will be expressed as</p>
<pre class="language-cpp highlight"><c- p>[[</c-><c- n>reason_deleted</c-><c- p>(</c-><c- s>"my reason"</c-><c- p>)]]</c->
<c- b>void</c-> <c- n>fun</c-><c- p>()</c-> <c- o>=</c-> <c- k>delete</c-><c- p>;</c->
</pre>
   <p>Personally, comparing these two syntaxes, I prefer the proposed <code class="highlight"><c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"reason"</c-><c- p>);</c-></code> one as it is more concise, less noisy, has reasoning closer to the actual deletion and does not
have to repeat yourself by saying first, "I delete this function" then "the reason for delete is ..." twice. An advantage I can see for <a data-link-type="biblio" href="#biblio-p1267r0" title="Custom Constraint Diagnostics">[P1267R0]</a>-like solutions
is that if the committee decided to accept several <code class="highlight"><c- p>[[</c-><c- n>reason_xxx</c-><c- p>(</c-><c- s>"reason"</c-><c- p>)]]</c-></code> family (SFINAE, <code class="highlight"><c- k>private</c-></code>, <code class="highlight"><c- o>=</c-> <c- k>delete</c-></code>, etc.), then the attribute with the same prefix can
be seen as more compatible with rest of the core language. However, since <a data-link-type="biblio" href="#biblio-p1267r0" title="Custom Constraint Diagnostics">[P1267R0]</a> is currently inactive, I will still propose the <code class="highlight"><c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"reason"</c-><c- p>);</c-></code> syntax.</p>
   <p>Of course, given that the <em>function-body</em> part of the grammar is relatively free, other (arcane?) syntax like <code class="highlight"><c- o>=</c-> <c- k>default</c-> <c- s>"reason"</c-><c- p>;</c-></code>, <code class="highlight"><c- o>=</c-> <c- k>default</c-><c- p>[</c-><c- s>"reason"</c-><c- p>]</c-></code> can be proposed;
I haven’t explored these syntaxes since I think the syntax I’m proposing is the most natural one and is fitting the existing practices.</p>
   <h4 class="heading settled" data-level="4.3.2" id="semantics"><span class="secno">4.3.2. </span><span class="content">Overriding Semantics</span><a class="self-link" href="#semantics"></a></h4>
    One of the new issues brought up by this new syntax is the overriding problem: 
<pre class="language-cpp highlight"><c- k>struct</c-> <c- nc>A</c->
<c- p>{</c->
    <c- k>virtual</c-> <c- b>void</c-> <c- n>fun</c-><c- p>()</c-> <c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"reason"</c-><c- p>);</c->
<c- p>};</c->
<c- k>struct</c-> <c- nc>B</c-> <c- o>:</c-> <c- k>public</c-> <c- n>A</c->
<c- p>{</c->
    <c- b>void</c-> <c- n>fun</c-><c- p>()</c-> <c- k>override</c-> <c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"different reason"</c-><c- p>);</c->
<c- p>};</c->
</pre>
   <p>Should overriding with a different (or no) message parameter be supported? (Notice that you cannot override deleted functions with non-deleted ones or vice versa, so this is the only form.)</p>
   <p>I believe that this should be supported for the following reason:</p>
   <ul>
    <li data-md>
     <p>Changing <code class="highlight"><c- o>=</c-> <c- k>delete</c-></code> message inside the library base classes should be non-breaking (non-observable).</p>
    <li data-md>
     <p>Existing attributes allow this (and even went further, allow an overriding function to change from having attribute to not having).</p>
   </ul>
   <h4 class="heading settled" data-level="4.3.3" id="unevaluated-strings"><span class="secno">4.3.3. </span><span class="content">Locales and Unevaluated Strings</span><a class="self-link" href="#unevaluated-strings"></a></h4>
    I heard that there had been already some discussion in the committee for this proposal, probably in the discussion phase of <a data-link-type="biblio" href="#biblio-p1267r0" title="Custom Constraint Diagnostics">[P1267R0]</a>;
the hesitancy is basically that the <em>string-literal</em>s being accepted in the structure is unrestricted, thus may raise some doubt on how to handle
things like <code class="highlight"><c- o>=</c-> <c- k>delete</c-><c- p>(</c->L<c- s>"Wide reason"</c-><c- p>);</c-></code>. 
   <p>However, this is not a problem unique to this proposal. This problem also applies to the other three existing examples, and there is <a data-link-type="biblio" href="#biblio-p2361r6" title="Unevaluated strings">[P2361R6]</a> to solve this problem in general. Therefore I do not see any reason locales of unevaluated strings should be an obstacle.</p>
   <p>As for the problem of displaying text that cannot be represented in the execution character set, this paper follows the existing <a data-link-type="biblio" href="#biblio-p2246r1" title="Character encoding of diagnostic text">[P2246R1]</a> changes to <code class="highlight"><c- k>static_assert</c-></code> wording and use "should" to allow flexibility.</p>
   <h4 class="heading settled" data-level="4.3.4" id="claim-of-syntax-space"><span class="secno">4.3.4. </span><span class="content">Claim of Syntax Space</span><a class="self-link" href="#claim-of-syntax-space"></a></h4>
    During EWGI review of this paper, some people expressed concern on the possibility of this proposal "claiming the syntax space" of possible further enhancement to <code class="highlight"><c- o>=</c-> <c- k>delete</c-></code>. Namely, it is possible for a future proposal to alter <code class="highlight"><c- o>=</c-> <c- k>delete</c-></code> the same way we altered <code class="highlight"><c- k>explicit</c-></code> in C++20, to give it an optional constant argument that
can express conditional <code class="highlight"><c- o>=</c-> <c- k>delete</c-></code>. Thus, the following code may become a possibility in future expansion: 
<pre class="language-cpp highlight"><c- b>void</c-> <c- nf>foo</c-><c- p>()</c-> <c- o>=</c-> <c- k>delete</c-> <c- p>(</c-><c- k>sizeof</c-><c- p>(</c-><c- b>int</c-><c- p>)</c-> <c- o>!=</c-> <c- mi>4</c-><c- p>);</c->
</pre>
   <p>I think this argument is ungrounded for two reasons:</p>
   <ul>
    <li data-md>
     <p>First of all, this proposal do not actually claim the full syntax space for the argument after <code class="highlight"><c- o>=</c-> <c- k>delete</c-></code>. Since in the C++ grammar, <em>string-literal</em>s have more priority
than ordinary <em>expression</em>s, it is still possible to add the ability to put an arbitrary constant boolean expression here. The semantics will simply be to prefer this proposal’s effect
if a string literal is passed.</p>
    <li data-md>
     <p>Secondly, I feel that <code class="highlight"><c- o>=</c-> <c- k>delete</c-> <c- p>(</c-><c- o>&lt;</c-><c- n>conditional</c-><c- o>-</c-><c- n>expression</c-><c- o>></c-><c- p>)</c-></code> is not a viable future direction, since you can express essentially the same meaning with <code class="highlight"><c- k>requires</c-></code> today. Granted, <code class="highlight"><c- k>requires</c-></code>’s semantics
are different from what <code class="highlight"><c- o>=</c-> <c- k>delete</c-></code> does, since the former SFINAE-away the function while the latter does not affect overload resolution at all. But I still find it hard to come up with a compelling use case
for conditional delete that cannot be achieved by concepts.</p>
   </ul>
   <h3 class="heading settled" data-level="4.4" id="proposal-scope"><span class="secno">4.4. </span><span class="content">Proposal Scope</span><a class="self-link" href="#proposal-scope"></a></h3>
    This proposal is a pure language extension proposal with no library changes involved and is a pure addition, so no breaking changes are involved.
It is intended practice that exchanging <code class="highlight"><c- o>=</c-> <c- k>delete</c-><c- p>;</c-></code> for <code class="highlight"><c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"message"</c-><c- p>);</c-></code> will have no breakage and no user-noticeable effect except for the diagnostic messages. 
   <p>There has been sustained strong push back to the idea of mandating diagnostic texts in the standard library specifications, and in my opinion, such complaints are justified.
This paper does not change this by only proposing to make such "deleted with reason" ability available and nothing more.</p>
   <p>This paper encourages vendors to apply any text they see fit for the purpose as a QoI, non-breaking feature.</p>
   <h3 class="heading settled" data-level="4.5" id="extensions"><span class="secno">4.5. </span><span class="content">Future Extensions</span><a class="self-link" href="#extensions"></a></h3>
    There have been suggestions on supporting arbitrary <em>constant-expression</em>s in <code class="highlight"><c- k>static_assert</c-></code> message parameter and other places so that we can generate something like 
<pre class="language-cpp highlight"><c- n>make_unique</c-><c- o>&lt;</c-><c- b>int</c-><c- p>[</c-><c- mi>5</c-><c- p>]</c-><c- o>></c-><c- p>(...)</c-> <c- n>is</c-> <c- k>not</c-> <c- n>supported</c-><c- p>;</c-> <c- n>perhaps</c-> <c- n>you</c-> <c- n>mean</c-> <c- n>make_unique</c-><c- o>&lt;</c-><c- b>int</c-><c- p>[]</c-><c- o>></c-><c- p>(</c-><c- mi>5</c-><c- p>)</c-> <c- n>instead</c-><c- o>?</c->
</pre>
   <p>for the invocation <code class="highlight"><c- n>make_unique</c-><c- o>&lt;</c-><c- b>int</c-><c- p>[</c-><c- mi>5</c-><c- p>]</c-><c- o>></c-><c- p>()</c-></code> (so that message come with concrete types). I do not oppose such extensions, and this proposal does not prevent supporting <code class="highlight"><c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- n>constant_string</c-><c- p>)</c-></code> in the future either.</p>
   <p>During Varna (2023-06), <a data-link-type="biblio" href="#biblio-p2741r3" title="user-generated static_assert messages">[P2741R3]</a> is adopted into the C++26 standard, giving <code class="highlight"><c- k>static_assert</c-></code> the ability to accept a user-generated string-like object as the message parameter.
However, I’m not sure if the corresponding support can be directly added to this feature, since <code class="highlight"><c- k>static_assert</c-></code> is a standalone statement, and this feature is currently an attachment to a function declaration,
which may lead to execution order issues. Therefore, currently I do not propose <code class="highlight"><c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- k>constexpr</c-><c- o>-</c-><c- n>string</c-><c- o>-</c-><c- n>expression</c-><c- p>)</c-></code> as parts of this proposal.
I felt that the support for it should come together with a separate proposal to add user-generated message support to <code class="highlight"><c- p>[[</c-><c- n>deprecated</c-><c- p>]]</c-></code> and <code class="highlight"><c- p>[[</c-><c- n>nodiscard</c-><c- p>]]</c-></code> too.</p>
   <p>Some people suggested considering the same message parameter for other keywords in the language, such as <code class="highlight"><c- k>final</c-><c- p>(</c-><c- s>"reason"</c-><c- p>)</c-></code> or <code class="highlight"><c- k>explicit</c-><c- p>(</c-><c- o>&lt;</c-><c- n>cond</c-><c- o>></c-><c- p>,</c-> <c- s>"reason"</c-><c- p>)</c-></code>. While such constructs might be useful, I felt that this may quickly escalate to a general facility
that supports a custom message for every ill-formed program, and that is a step too far in my opinion. <code class="highlight"><c- o>=</c-> <c- k>delete</c-></code> is different from those two keywords in the sense that it might be used as a transitional method (to be added after the introduction of API to indicate deprecation),
while the other two constructs are usually set in stone after initial API. Furthermore, the applicable scope of <code class="highlight"><c- k>final</c-></code> (only on classes and virtual member functions) and <code class="highlight"><c- k>explicit</c-></code> (only on constructors) are both much more narrow than <code class="highlight"><c- o>=</c-> <c- k>delete</c-></code> (which can be applied on any function),
so I think just a controlled introduction of <code class="highlight"><c- o>=</c-> <c- k>delete</c-></code> should be most beneficial to users of the language without introducing too much novelty.</p>
   <h3 class="heading settled" data-level="4.6" id="target-vehicle"><span class="secno">4.6. </span><span class="content">Target Vehicle</span><a class="self-link" href="#target-vehicle"></a></h3>
    This proposal targets C++26. 
   <h3 class="heading settled" data-level="4.7" id="feature-test-macro"><span class="secno">4.7. </span><span class="content">Feature Test Macro</span><a class="self-link" href="#feature-test-macro"></a></h3>
    The previous works all bump the relevant attributes or feature testing macros to a new value to resemble the change. However, C++11 default and deleted functions don’t
have a feature test macro, so I propose to include a new language feature testing macro <code class="highlight"><c- n>__cpp_deleted_function</c-></code> (name can be changed) with the usual value. 
   <h2 class="heading settled" data-level="5" id="implementation"><span class="secno">5. </span><span class="content">Implementation Experience</span><a class="self-link" href="#implementation"></a></h2>
   <p>An experimental implementation of the proposed feature is located in my Clang fork at <a data-link-type="biblio" href="#biblio-clang-implementation" title="Mick235711&apos;s Clang Fork">[clang-implementation]</a>, which is capable of handling</p>
<pre class="language-cpp highlight"><c- b>void</c-> <c- n>foo</c-><c- p>()</c-> <c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"Reason"</c-><c- p>);</c->
<c- b>void</c-> <c- nf>fun</c-><c- p>()</c-> <c- p>{</c-><c- n>foo</c-><c- p>();}</c->
</pre>
   <p>and output the following error message: (close to what I want; of course, there are other formats such as put reason on separate lines)</p>
<pre class="language-cpp highlight"><c- n>propose</c-><c- p>.</c-><c- n>cpp</c-><c- o>:</c-><c- mi>2</c-><c- o>:</c-><c- mi>13</c-><c- o>:</c-> <c- n>error</c-><c- o>:</c-> <c- n>call</c-> <c- n>to</c-> <c- n>deleted</c-> <c- n>function</c-> '<c- n>foo</c->'<c- o>:</c-> <c- s>"Reason"</c->
<c- b>void</c-> <c- n>fun</c-><c- p>()</c-> <c- p>{</c-><c- n>foo</c-><c- p>();}</c->
            <c- o>^~~</c->
<c- n>propose</c-><c- p>.</c-><c- n>cpp</c-><c- o>:</c-><c- mi>1</c-><c- o>:</c-><c- mi>6</c-><c- o>:</c-> <c- n>note</c-><c- o>:</c-> <c- n>candidate</c-> <c- n>function</c-> <c- n>has</c-> <c- n>been</c-> <c- n>explicitly</c-> <c- n>deleted</c->
<c- b>void</c-> <c- n>foo</c-><c- p>()</c-> <c- o>=</c-> <c- k>delete</c-><c- p>(</c-><c- s>"Reason"</c-><c- p>);</c->
     <c- o>^</c->
<c- mi>1</c-> <c- n>error</c-> <c- n>generated</c-><c- p>.</c->
</pre>
   <p>The implementation is <em>very</em> incomplete (no support for constructors, no feature-test macro, only a few testing, etc.), so it is only aimed at proving that the vendors can support
the proposed feature relatively easily.</p>
   <h2 class="heading settled" data-level="6" id="wording"><span class="secno">6. </span><span class="content">Wording</span><a class="self-link" href="#wording"></a></h2>
   <p>The wording below is based on <a data-link-type="biblio" href="#biblio-n4971" title="Working Draft, Programming Languages — C++">[N4971]</a>.</p>
   <p>Wording notes for CWG and editor:</p>
   <ul>
    <li data-md>
     <p>This wording factors existing <code class="highlight"><c- o>=</c-> <c- k>delete</c-><c- p>;</c-></code> in the <em>function-body</em> out to a new grammar token, <em>deleted-function-body</em>, to allow reusing.</p>
    <li data-md>
     <p>The current wording is basically a combination of <code class="highlight"><c- k>static_assert</c-></code> ([dcl.pre]/12) and <code class="highlight"><c- p>[[</c-><c- n>deprecated</c-><c- p>]]</c-></code> ([dcl.attr.deprecated]/n2, for error instead of warning).</p>
   </ul>
   <h3 class="heading settled" data-level="6.1" id="dcl.fct.def"><span class="secno">6.1. </span><span class="content">9.5 Function definitions [dcl.fct.def]</span><a class="self-link" href="#dcl.fct.def"></a></h3>
   <h4 class="heading settled" data-level="6.1.1" id="dcl.fct.def.general"><span class="secno">6.1.1. </span><span class="content">9.5.1 In general [dcl.fct.def.general]</span><a class="self-link" href="#dcl.fct.def.general"></a></h4>
   <blockquote>
    <p>Function definitions have the form</p>
   </blockquote>
<pre class="highlight"><i>function-definition</i>:
    <i>attribute-specifier-seq<sub>opt</sub> decl-specifier-seq<sub>opt</sub> declarator virt-specifier-seq<sub>opt</sub> function-body</i>
    <i>attribute-specifier-seq<sub>opt</sub> decl-specifier-seq<sub>opt</sub> declarator requires-clause function-body</i>
<i>function-body</i>:
    <i>ctor-initializer<sub>opt</sub> compound-statement</i>
    <i>function-try-block</i>
    = default ;
    <del>= delete ;</del><ins><i>deleted-function-body</i></ins>
<ins><i>deleted-function-body</i>:
    = delete ;
    = delete ( <i>unevaluated-string</i> ) ;</ins>
</pre>
   <h4 class="heading settled" data-level="6.1.2" id="dcl.fct.def.delete"><span class="secno">6.1.2. </span><span class="content">9.5.3 Deleted definitions [dcl.fct.def.delete]</span><a class="self-link" href="#dcl.fct.def.delete"></a></h4>
    Paragraph 1: 
   <blockquote>
    <p>
     A <em>deleted definition</em> of a function is a function definition whose <em>function-body</em> is 
     <del>of the form <code class="highlight"><c- o>=</c-> <c- k>delete</c-> <c- p>;</c-></code></del>
     <ins>a <em>deleted-function-body</em></ins>
      or an explicitly-defaulted definition of the function
where the function is defined as deleted. A <em>deleted function</em> is a function with a deleted definition or a function that is implicitly defined as deleted.
    </p>
   </blockquote>
   <p>Paragraph 2:</p>
   <blockquote>
    <p>A program that refers to a deleted function implicitly or explicitly, other than to declare it, is ill-formed.</p>
   </blockquote>
   <blockquote>
    <ins><em>Recommended practice</em>: The resulting diagnostic message should include the text of the <em>unevaluated-string</em>, if one is supplied.</ins>
   </blockquote>
   <blockquote>
    <p>
     [<em>Note 1</em>: This includes calling the function implicitly or explicitly and forming a pointer or pointer-to-member to the function.
It applies even for references in expressions that are not potentially-evaluated. For an overload set, only the function selected by overload resolution is referenced.
The implicit odr-use ([basic.def.odr]) of a virtual function does not, by itself, constitute a reference. 
     <ins>The <em>unevaluated-string</em>, if present, can be used to explain the rationale for deletion and/or to suggest an alternative.</ins>
      — <em>end note</em>]
    </p>
   </blockquote>
   <h3 class="heading settled" data-level="6.2" id="cpp.predefined"><span class="secno">6.2. </span><span class="content">15.11 Predefined macro names [cpp.predefined]</span><a class="self-link" href="#cpp.predefined"></a></h3>
    In [tab:cpp.predefined.ft], insert a new row in a place that respects the current alphabetical order of the table, and substituting <code class="highlight"><c- mi>20</c-><c- n>XXYYL</c-></code> by the date of adoption. 
   <table>
    <thead>
     <tr>
      <td>Macro name
      <td>Value
    <tbody>
     <tr>
      <td>
       <ins><code class="highlight"><c- n>__cpp_deleted_function</c-></code></ins>
      <td>
       <ins><code class="highlight"><c- mi>20</c-><c- n>XXYYL</c-></code></ins>
   </table>
  </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="normative"><span class="content">Normative References</span><a class="self-link" href="#normative"></a></h3>
  <dl>
   <dt id="biblio-clang-implementation">[CLANG-IMPLEMENTATION]
   <dd>Yihe Li. <a href="https://github.com/Mick235711/llvm-project/tree/delete-with-reason"><cite>Mick235711's Clang Fork</cite></a>. URL: <a href="https://github.com/Mick235711/llvm-project/tree/delete-with-reason">https://github.com/Mick235711/llvm-project/tree/delete-with-reason</a>
   <dt id="biblio-n4186">[N4186]
   <dd>Matthias Kretz. <a href="https://wg21.link/n4186"><cite>Supporting Custom Diagnostics and SFINAE</cite></a>. 10 October 2014. URL: <a href="https://wg21.link/n4186">https://wg21.link/n4186</a>
   <dt id="biblio-n4971">[N4971]
   <dd>Thomas Köppe. <a href="https://wg21.link/n4971"><cite>Working Draft, Programming Languages — C++</cite></a>. 18 December 2023. URL: <a href="https://wg21.link/n4971">https://wg21.link/n4971</a>
   <dt id="biblio-p2573r1">[P2573R1]
   <dd>Yihe Li. <a href="https://wg21.link/p2573r1"><cite>= delete("should have a reason");</cite></a>. 11 November 2023. URL: <a href="https://wg21.link/p2573r1">https://wg21.link/p2573r1</a>
  </dl>
  <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-actcd19">[ACTCD19]
   <dd>Andrew Tomazos. <a href="https://codesearch.isocpp.org"><cite>Andrew's C/C++ Token Count Dataset 2019</cite></a>. URL: <a href="https://codesearch.isocpp.org">https://codesearch.isocpp.org</a>
   <dt id="biblio-ewg152">[EWG152]
   <dd>Matthias Kretz. <a href="https://wg21.link/ewg152"><cite>N4186 Supporting Custom Diagnostics and SFINAE</cite></a>. Open. URL: <a href="https://wg21.link/ewg152">https://wg21.link/ewg152</a>
   <dt id="biblio-n1720">[N1720]
   <dd>R. Klarer, J. Maddock, B. Dawes, H. Hinnant. <a href="https://wg21.link/n1720"><cite>Proposal to Add Static Assertions to the Core Language (Revision 3)</cite></a>. 20 October 2004. URL: <a href="https://wg21.link/n1720">https://wg21.link/n1720</a>
   <dt id="biblio-n2346">[N2346]
   <dd>Lawrence Crowl. <a href="https://wg21.link/n2346"><cite>Defaulted and Deleted Functions</cite></a>. 19 July 2007. URL: <a href="https://wg21.link/n2346">https://wg21.link/n2346</a>
   <dt id="biblio-n3760">[N3760]
   <dd>Alberto Ganesh Barbati. <a href="https://wg21.link/n3760"><cite>[[deprecated]] attribute</cite></a>. 1 September 2013. URL: <a href="https://wg21.link/n3760">https://wg21.link/n3760</a>
   <dt id="biblio-n4958">[N4958]
   <dd>Thomas Köppe. <a href="https://wg21.link/n4958"><cite>Working Draft, Programming Languages — C++</cite></a>. 14 August 2023. URL: <a href="https://wg21.link/n4958">https://wg21.link/n4958</a>
   <dt id="biblio-p1267r0">[P1267R0]
   <dd>Hana Dusíková, Bryce Adelstein Lelbach. <a href="https://wg21.link/p1267r0"><cite>Custom Constraint Diagnostics</cite></a>. 8 October 2018. URL: <a href="https://wg21.link/p1267r0">https://wg21.link/p1267r0</a>
   <dt id="biblio-p1301r4">[P1301R4]
   <dd>JeanHeyd Meneide, Isabella Muerte. <a href="https://wg21.link/p1301r4"><cite>[[nodiscard("should have a reason")]]</cite></a>. 5 August 2019. URL: <a href="https://wg21.link/p1301r4">https://wg21.link/p1301r4</a>
   <dt id="biblio-p2246r1">[P2246R1]
   <dd>Aaron Ballman. <a href="https://wg21.link/p2246r1"><cite>Character encoding of diagnostic text</cite></a>. 15 January 2021. URL: <a href="https://wg21.link/p2246r1">https://wg21.link/p2246r1</a>
   <dt id="biblio-p2361r6">[P2361R6]
   <dd>Corentin Jabot, Aaron Ballman. <a href="https://wg21.link/p2361r6"><cite>Unevaluated strings</cite></a>. 12 February 2023. URL: <a href="https://wg21.link/p2361r6">https://wg21.link/p2361r6</a>
   <dt id="biblio-p2741r3">[P2741R3]
   <dd>Corentin Jabot. <a href="https://wg21.link/p2741r3"><cite>user-generated static_assert messages</cite></a>. 16 June 2023. URL: <a href="https://wg21.link/p2741r3">https://wg21.link/p2741r3</a>
  </dl>