<!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>P1144R13: std::is_trivially_relocatable</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 b25686b9f, updated Fri Mar 14 14:15:20 2025 -0700" name="generator">
  <link href="https://isocpp.org/favicon.ico" rel="icon">
  <meta content="dark light" name="color-scheme">
<style>
body {-moz-hyphens: none; -ms-hyphens: none; -webkit-hyphens: none; hyphens: none;}
ins  {color: light-dark(black, #DDDDDD); background-color: light-dark(#CCFFCC, #005500); text-decoration: underline;}
del  {color: light-dark(black, #FFCACA); background-color: light-dark(#FFCACA, #440000); text-decoration: line-through;}
good  {color: light-dark(black, #DDDDDD); background-color: light-dark(#CCFFCC, #005500); text-decoration: underline;}
bad  {color: light-dark(black, #FFCACA); background-color: light-dark(#FFCACA, #550000); text-decoration: underline;}
</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">P1144R13<br>std::is_trivially_relocatable</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="2025-05-13">2025-05-13</time></span></h2>
   <div data-fill-with="spec-metadata">
    <dl>
     <dt class="editor">Authors:
     <dd class="editor p-author h-card vcard"><a class="p-name fn u-email email" href="mailto:arthur.j.odwyer@gmail.com">Arthur O'Dwyer</a>
     <dd class="editor p-author h-card vcard"><a class="p-name fn u-email email" href="mailto:artur@ebasoft.com.pl">Artur Bać</a>
     <dd class="editor p-author h-card vcard"><a class="p-name fn u-email email" href="mailto:dlanders@andrew.cmu.edu">Daniel Liam Anderson</a>
     <dd class="editor p-author h-card vcard"><a class="p-name fn u-email email" href="mailto:kaffedesk@gmail.com">Enrico Mauro</a>
     <dd class="editor p-author h-card vcard"><a class="p-name fn u-email email" href="mailto:coachhagins@gmail.com">Jody Hagins</a>
     <dd class="editor p-author h-card vcard"><a class="p-name fn u-email email" href="mailto:michael_steffens@posteo.de">Michael Steffens</a>
     <dd class="editor p-author h-card vcard"><a class="p-name fn u-email email" href="mailto:stephane.janel@gmail.com">Stéphane Janel</a>
     <dd class="editor p-author h-card vcard"><a class="p-name fn u-email email" href="mailto:vinnie.falco@gmail.com">Vinnie Falco</a>
     <dd class="editor p-author h-card vcard"><a class="p-name fn u-email email" href="mailto:webrown.cpp@gmail.com">Walter E. Brown</a>
     <dd class="editor p-author h-card vcard"><a class="p-name fn u-email email" href="mailto:wjwray@gmail.com">Will Wray</a>
     <dt>Audience:
     <dd>WG21
     <dt>Project:
     <dd>ISO/IEC 14882 Programming Languages — C++, ISO/IEC JTC1/SC22/WG21
    </dl>
   </div>
   <div data-fill-with="warning"></div>
   <hr title="Separator for header">
  </div>
  <div class="p-summary" data-fill-with="abstract">
   <h2 class="no-num no-toc no-ref heading settled" id="abstract"><span class="content">Abstract</span></h2>
   <p>P1144-style trivial relocation is used by Abseil, AMC, BSL, Folly, HPX, Parlay, Pocketpy, Qt, Subspace, and Thrust.
Let’s make it part of the C++ standard.</p>
  </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="#intro"><span class="secno">1</span> <span class="content">What’s going on here?</span></a>
     <ol class="toc">
      <li><a href="#input-sjanel"><span class="secno">1.1</span> <span class="content">Statement from Stéphane Janel</span></a>
      <li><a href="#input-vfalco"><span class="secno">1.2</span> <span class="content">Statement from Vinnie Falco</span></a>
      <li><a href="#input-msteffens"><span class="secno">1.3</span> <span class="content">Statement from Michael Steffens</span></a>
      <li><a href="#input-aodwyer"><span class="secno">1.4</span> <span class="content">Statement from Arthur O’Dwyer</span></a>
     </ol>
    <li><a href="#scope"><span class="secno">2</span> <span class="content">Scope and design</span></a>
    <li>
     <a href="#wording"><span class="secno">3</span> <span class="content">Proposed wording</span></a>
     <ol class="toc">
      <li><a href="#wording-cpp.predefined"><span class="secno">3.1</span> <span class="content">[cpp.predefined]</span></a>
      <li><a href="#wording-version.syn"><span class="secno">3.2</span> <span class="content">[version.syn]</span></a>
      <li><a href="#wording-basic.types.general"><span class="secno">3.3</span> <span class="content">[basic.types.general]</span></a>
      <li><a href="#wording-class.pre"><span class="secno">3.4</span> <span class="content">[class.pre]</span></a>
      <li><a href="#wording-class.prop"><span class="secno">3.5</span> <span class="content">[class.prop]</span></a>
      <li><a href="#wording-cpp.cond"><span class="secno">3.6</span> <span class="content">[cpp.cond]</span></a>
      <li><a href="#wording-dcl.attr.trivreloc"><span class="secno">3.7</span> <span class="content">[dcl.attr.trivreloc]</span></a>
      <li><a href="#wording-expr.prim.lambda.closure"><span class="secno">3.8</span> <span class="content">[expr.prim.lambda.closure]</span></a>
      <li><a href="#wording-lex.name"><span class="secno">3.9</span> <span class="content">[lex.name]</span></a>
      <li><a href="#wording-library.class.props"><span class="secno">3.10</span> <span class="content">[library.class.props]</span></a>
      <li><a href="#wording-meta.type.synop"><span class="secno">3.11</span> <span class="content">[meta.type.synop]</span></a>
      <li><a href="#wording-meta.unary.prop"><span class="secno">3.12</span> <span class="content">[meta.unary.prop]</span></a>
      <li><a href="#wording-obj.lifetime"><span class="secno">3.13</span> <span class="content">[obj.lifetime]</span></a>
      <li><a href="#wording-diff.cpp23.dcl.dcl"><span class="secno">3.14</span> <span class="content">[diff.cpp23.dcl.dcl]</span></a>
     </ol>
    <li>
     <a href="#references"><span class="secno"></span> <span class="content">References</span></a>
     <ol class="toc">
      <li><a href="#informative"><span class="secno"></span> <span class="content">Informative References</span></a>
     </ol>
   </ol>
  </nav>
  <main>
   <h2 class="heading settled" data-level="1" id="intro"><span class="secno">1. </span><span class="content">What’s going on here?</span><a class="self-link" href="#intro"></a></h2>
   <p>Some of us submitted <a data-link-type="biblio" href="#biblio-p3236" title="Please reject P2786 and adopt P1144">[P3236]</a> for St Louis 2024, indicating our disapproval of <a data-link-type="biblio" href="#biblio-p2786r4" title="Trivial Relocatability For C++26">[P2786R4]</a> and asking for our preferred direction <a data-link-type="biblio" href="#biblio-p1144r10" title="std::is_trivially_relocatable">[P1144R10]</a> to be discussed in committee. This resulted
in EWG’s "clawing back" P2786 for one meeting, but did not result in any committee discussion
of P1144, due to its author.</p>
   <p><a data-link-type="biblio" href="#biblio-p2786r13" title="Trivial Relocatability For C++26">[P2786R13]</a> was then merged into the Working Draft (<a data-link-type="biblio" href="#biblio-n5008" title="Working Draft — Programming Languages — C++">[N5008]</a>) at Hagenberg 2024.
Almost all of P3236’s objections remain unaddressed. Here are P3236’s objections again:</p>
   <ul>
    <li data-md>
     <p>
      "Types with user-provided <code class="highlight"><c- k>operator</c-><c- o>=</c-></code> are reported as trivially relocatable by default."
  
      <good>Addressed.</good>
     </p>
    <li data-md>
     <p>
      "The programmer is allowed to create a type that is trivially copyable but not trivially relocatable."
  
      <bad>Not addressed.</bad>
     </p>
    <li data-md>
     <p>
      "It’s ill-formed to create a trivially relocatable type with an <code class="highlight"><c- n>offset_ptr</c-></code> member,
or even a Boost <code class="highlight"><c- n>static_vector</c-></code> member."
  
      <bad>Not addressed.</bad>
     </p>
    <li data-md>
     <p>
      "No backward-compatible syntax. P2786 proposes a new keyword, and goes out of its way to make the keyword unusable in C++23-and-earlier."
  
      <bad>Not addressed.</bad>
     </p>
    <li data-md>
     <p>
      "P1144, by providing stronger guarantees of value semantics, permits more optimizations."
  
      <bad>Not addressed.</bad>
     </p>
    <li data-md>
     <p>
      "P1144 provides a well-designed and stable library API."
  
      <good>Addressed,</good>
       in that the P1144 library API has been approved for C++26 via <a data-link-type="biblio" href="#biblio-p3516" title="Uninitialized algorithms for relocation">[P3516]</a>.
     </p>
    <li data-md>
     <p>
      "P2786’s warrant marking is ‘viral downward.’ As container authors, we think P2786’s normalization
of a large number of explicit markings will cause programmer fatigue and lead to bugs."
  
      <bad>Not addressed.</bad>
     </p>
    <li data-md>
     <p>"Deliberately incomplete. P2786’s authors have drafted followup papers including <a data-link-type="biblio" href="#biblio-p2959" title="Relocation within containers">[P2959]</a> and <a data-link-type="biblio" href="#biblio-p2967" title="Relocation has a library interface">[P2967]</a>, all with incomplete wording and ‘heroic’ changes,
for example <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>container_replace_with_assignment</c-></code>."
  Arguably addressed, in that P2786 was merged in its present state, and P2959 and P2967
seem to have been abandoned. We now know with certainty what we have gotten,
and we can say with certainty that it does not suit us.</p>
   </ul>
   <p>In addition, the Working Draft version of P2786R13 contains several problems that weren’t present in P2786R4 at the time we wrote <a data-link-type="biblio" href="#biblio-p3236" title="Please reject P2786 and adopt P1144">[P3236]</a>.</p>
   <ul>
    <li data-md>
     <p>
      The ARM64e platform uses "vptr signing." Its vptrs are never safe to memcpy. Yet the Working Draft
permits <code class="highlight"><c- n>is_trivially_relocatable</c-></code> to return <code class="highlight">true</code> for types with vptrs, types recursively
containing members with vptrs, etc. This means that it is never safe to use e.g. <code class="highlight"><c- n>realloc</c-></code> on ARM64e even when we know that the objects being reallocated are all <code class="highlight"><c- n>is_trivially_relocatable</c-></code>.
  
      <bad>New problem, not addressed.</bad>
     </p>
    <li data-md>
     <p>
      P2786’s approved syntax is shockingly ugly: <code class="highlight"><c- k>class</c-> <c- nc>C</c-> <c- n>trivially_relocatable_if_eligible</c-> <c- n>replaceable_if_eligible</c-> <c- p>{</c-> <c- p>}</c-></code>.
P1144’s attribute syntax is unobtrusive by comparison: <code class="highlight"><c- k>class</c-> <c- p>[[</c-><c- n>trivially_relocatable</c-><c- p>]]</c-> <c- n>C</c-> <c- p>{</c-> <c- p>}</c-></code>.
  
      <bad>New problem, not addressed.</bad>
     </p>
   </ul>
   <p>Therefore we submit this revision of P1144, which addresses all of these problems directly,
as a diff against the current Working Draft. We gladly list ourselves as coauthors of this proposal,
in the same way that five Bloomberg employees listed themselves as coauthors of <a data-link-type="biblio" href="#biblio-p2786r13" title="Trivial Relocatability For C++26">[P2786R13]</a>.
Unlike them, we come from a variety of backgrounds and maintain a variety of codebases.</p>
   <p>We beg WG21 to resolve the community’s concerns before it is too late.</p>
   <h3 class="heading settled" data-level="1.1" id="input-sjanel"><span class="secno">1.1. </span><span class="content">Statement from Stéphane Janel</span><a class="self-link" href="#input-sjanel"></a></h3>
   <p>Stéphane Janel is the maintainer of <a href="https://github.com/AmadeusITGroup/amc/">AmadeusITGroup/amc</a>, a collection
of high-performance C++ containers used in the Amadeus pricing and shopping engines.</p>
   <blockquote>
    <p>Hello Arthur,</p>
    <p>As already discussed together, I am hugely in favor of P1144 against P2786.</p>
    <p>The reasons are perfectly described <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3233r0.html">here</a> and for me the main point is that P1144 better integrates with current type traits,
and is much more natural to use. I don’t know how to target WG21 though, feel free to forward my email if it can help.</p>
   </blockquote>
   <h3 class="heading settled" data-level="1.2" id="input-vfalco"><span class="secno">1.2. </span><span class="content">Statement from Vinnie Falco</span><a class="self-link" href="#input-vfalco"></a></h3>
   <p>Vinnie Falco is the maintainer of <a href="https://github.com/boostorg/json/">Boost.JSON</a>, a portable C++ library of
containers and algorithms that implement the JSON lightweight data-interchange format.</p>
   <blockquote>
    <p>Boost.JSON makes intense use of trivial relocation for its variant-like container, <a href="https://github.com/boostorg/json/blob/0b1048adf7571b42ae9f684b63e4383241b9e4a1/include/boost/json/value.hpp#L55"><code class="highlight"><c- n>boost</c-><c- o>::</c-><c- n>json</c-><c- o>::</c-><c- n>value</c-></code></a>,
which can hold any kind of JSON node including arrays, objects, and strings.</p>
    <p>This means when resizing an array of values (represented by the type <code class="highlight"><c- n>boost</c-><c- o>::</c-><c- n>json</c-><c- o>::</c-><c- n>array</c-></code>)
or an unordered container of values (represented by the type <code class="highlight"><c- n>boost</c-><c- o>::</c-><c- n>json</c-><c- o>::</c-><c- n>object</c-></code>),
the implementation can <a href="https://github.com/boostorg/json/blob/0b1048adf7571b42ae9f684b63e4383241b9e4a1/include/boost/json/impl/array.ipp#L692">simply <code class="highlight"><c- n>relocate</c-></code></a> the contents of the container. The implementation of <code class="highlight"><c- n>relocate</c-><c- p>()</c-></code> for an array of <code class="highlight"><c- n>value</c-></code> is <a href="https://github.com/boostorg/json/blob/0b1048adf7571b42ae9f684b63e4383241b9e4a1/include/boost/json/value.hpp#L4152">simply <code class="highlight"><c- n>memcpy</c-></code></a>.</p>
    <p>Since Boost.JSON requires only C++11 we have to make some assumptions which are in principle not portable,
yet in practice work everywhere (we have not gotten any reports of malfunctions).
To keep the library’s data types clean and first-class, we adopted Peter Dimov’s "pilfer construction" approach
from <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0308r0.html">P0308R0</a>,
which is related to trivial relocation.</p>
    <p>I’m happy to answer questions about the library if it can help the committee make better design choices,
although it seems like decisions have already been made. Unfortunately I do not have the motivation
to get more involved as there is little indication that quality of outcome is proportional to the level of effort invested.</p>
   </blockquote>
   <h3 class="heading settled" data-level="1.3" id="input-msteffens"><span class="secno">1.3. </span><span class="content">Statement from Michael Steffens</span><a class="self-link" href="#input-msteffens"></a></h3>
   <p>Dr. Michael Steffens is the author of <a href="https://gitlab.com/misteffens/TrivialityInversion/-/tree/main">misteffens/TrivialityInversion</a>,
a public proof-of-concept for storage-location-agnostic C++ container types. His <code class="highlight"><c- n>BoundedVector</c-></code> type includes an <code class="highlight"><c- n>offset_ptr</c-></code>-into-self as a data member, making <code class="highlight"><c- n>BoundedVector</c-></code> trivially relocatable (for most types)
even though one of its data members is not.</p>
   <blockquote>
    <p>It seems that you are raising a lot of concerns with P2786 — on
different abstraction levels — but the key concern in my context
seems to be the lack of opt-in trivial relocatability.
I have read arguments in favor of that opt-out-only, claiming
that it’s safer not to allow opt-in, overriding what the compiler could
deduce on its own, as that could be done in error. And it’s not seen as
a functional gap, but only a missed opportunity for optimization.</p>
    <p>In my particular case (as in <code class="highlight"><c- n>boost</c-><c- o>::</c-><c- n>interprocess</c-></code>) the motivation is not
optimization, but storing objects in shared memory and coping with their
different address offsets in different processes. As C++ standards do
not cover IPC at all yet, we map the use of SHM to trivial
copying or relocation, as if objects would end their life in one process
and be memmoved to the other process (and back, as needed), being aware
that the memmove never actually happens. Instead it’s kind of an excuse
to start/end object lifetimes on the other side without construction or
destruction. This use case cannot be covered at all without the opt-in.</p>
    <p>If I understood everything right until this point, sure, I’d like to
lend a hand on the P1144 side, based on the need to have a workaround
for IPC.</p>
   </blockquote>
   <h3 class="heading settled" data-level="1.4" id="input-aodwyer"><span class="secno">1.4. </span><span class="content">Statement from Arthur O’Dwyer</span><a class="self-link" href="#input-aodwyer"></a></h3>
   <p>Arthur O’Dwyer is the maintainer of <a href="https://github.com/Quuxplusone/SG14">Quuxplusone/SG14</a>,
a library of containers and algorithms pioneered by the low-latency study group.
He also maintains a non-public <code class="highlight"><c- n>Vector</c-></code> implementation and a public P1144+P3516-compliant <a href="https://github.com/Quuxplusone/llvm-project/tree/trivially-relocatable">fork of libc++</a>.
He was previously the sole credited author of P1144 up to R12.</p>
   <blockquote>
    <p>I want to be clear: I did not <em>invent</em> trivial relocation in my P1144R0. That paper was based
on implementations already in the wild in 2018: notably BSL, Qt, and Folly.
Since then, more than a dozen other libraries have adopted the same semantics and most (including Qt)
have adopted the terminology from P1144 and P3516.
At least five library authors have written blogs or documentation about their use of "trivial relocation": <a href="https://github.com/facebook/folly/blob/main/folly/docs/FBVector.md#object-relocation">Folly</a>, <a href="https://github.com/AmadeusITGroup/amc/?tab=readme-ov-file#what-is-a-trivially-relocatable-type">AMC</a>, <a href="https://www.kdab.com/qt-and-trivial-relocation-part-5/">Qt</a>, <a href="https://orodu.net/2023/01/15/trivially-relocatable.html">Subspace</a>, <a href="https://isidorostsa.github.io/gsoc2023/">HPX</a>. Without exception,
the people using it and writing about it follow the same path:
the semantics recorded in (not originated by!) P1144 and P3516.</p>
    <p>Standardizing the prevailing term of art, as documented in the five links above, would be great.
WG21’s repurposing the prevailing term for a different meaning will lead only to confusion and safety bugs.</p>
   </blockquote>
   <h2 class="heading settled" data-level="2" id="scope"><span class="secno">2. </span><span class="content">Scope and design</span><a class="self-link" href="#scope"></a></h2>
   <p>In this rebased proposal, we propose:</p>
   <ul>
    <li data-md>
     <p>The set of trivially relocatable types should be exactly those types which can be relocated as-if by memcpy.
We change the definition of "trivially relocatable class" (<a href="#wording-basic.types.general">[basic.types.general]</a>)
to include all trivially copyable types, and to exclude
polymorphic types which require additional fixup beyond a simple memcpy.
We need trivial relocatability to imply memcpy-ability and realloc-ability, or it is useless to us.</p>
    <li data-md>
     <p>Remove the possibility that <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>trivially_relocate</c-></code> (<a href="#wording-obj.lifetime">[obj.lifetime]</a>) might
do anything other than a simple memcpy of the underlying bytes.
Otherwise we preserve the <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>trivially_relocate</c-></code> and <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>relocate</c-></code> functions; we do not mind them.
What is important is that they must be <em>trivial;</em> they must not be allowed to perform non-trivial "fixup" of the
relocated objects (e.g. to fix up the vptrs of polymorphic objects).</p>
    <li data-md>
     <p>Remove the terms <em>default-movable</em> and <em>eligible for trivial relocation</em> (<a href="#wording-class.prop">[class.prop]</a>).
They are no longer needed.</p>
    <li data-md>
     <p>Remove the terms <em>replaceable type</em> (<a href="#wording-basic.types.general">[basic.types.general]</a>), <em>eligible for replacement</em>, and <em>replaceable class</em> (<a href="#wording-class.prop">[class.prop]</a>)
and the <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>is_replaceable</c-></code> type-trait (<a href="#wording-meta.type.synop">[meta.type.synop]</a>)
Nothing in <a data-link-type="biblio" href="#biblio-n5008" title="Working Draft — Programming Languages — C++">[N5008]</a> (nor <a data-link-type="biblio" href="#biblio-p3516" title="Uninitialized algorithms for relocation">[P3516]</a>) depends on these notions.
They are likely to cause confusion to end-users, particularly in their similarity to the existing
term of art "transparently replaceable" (<a href="https://eel.is/c++draft/basic.life#def:transparently_replaceable">[basic.life]</a>).
We believe they <a href="https://stackoverflow.com/questions/79534079/what-is-the-purpose-semantics-of-p2786-is-replaceable">are not useful</a> to library authors.</p>
    <li data-md>
     <p>Remove the <code class="highlight"><c- n>trivially_relocatable_if_eligible</c-></code> and <code class="highlight"><c- n>replaceable_if_eligible</c-></code> keywords (<a href="#wording-lex.name">[lex.name]</a>).
They are ugly. They are difficult to use correctly because they are "viral"; see <a data-link-type="biblio" href="#biblio-p3236" title="Please reject P2786 and adopt P1144">[P3236]</a>.
They are unusable outside of C++26 mode.
We propose to replace both contextual keywords with a single ignorable attribute, which compiler vendors can choose to support
even in older C++ modes if they want.</p>
    <li data-md>
     <p>Remove the Annex C entry (<a href="#wording-diff.cpp23.dcl.dcl">[diff.cpp23.dcl.dcl]</a>) and discussion of new grammatical
ambiguities (<a href="#wording-class.pre">[class.pre]</a>) caused by the P2786 syntax.
These grammatical issues no longer exist.</p>
    <li data-md>
     <p>Preserve the <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>is_trivially_relocatable</c-></code> and <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>is_nothrow_relocatable</c-></code> type-traits.</p>
    <li data-md>
     <p>Add the <code class="highlight"><c- p>[[</c-><c- n>trivially_relocatable</c-><c- p>]]</c-></code> attribute as used by <a href="https://github.com/charles-salvia/std_error/blob/25a2263152d4fe1b923c8daa568c9f61157f3939/include/compiler.hpp#L60-L64">std_error</a>, <a href="https://github.com/cmuparlay/parlaylib/blob/36459f42a84207330eae706c47e6fab712e6a149/include/parlay/type_traits.h#L309-L313">parlaylib</a>,
and <a href="https://github.com/Quuxplusone/SG14/blob/ee3de047e6b54975674caf5f9d6342489b7003d9/include/sg14/inplace_vector.h#L47-L53">SG14</a>.
Note the lack of "if eligible" qualification: this attribute has "sharp knife" semantics suitable for
our purposes and matching our current use-cases. (See <a data-link-type="biblio" href="#biblio-p3236" title="Please reject P2786 and adopt P1144">[P3236]</a>.)
Unlike the contextual keywords, this attribute can be supported in older C++ modes too.</p>
    <li data-md>
     <p>We do not need to propose P1144’s library functionality — <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>uninitialized_relocate</c-></code>, <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>relocate_at</c-></code>, and so on —​because that functionality has been submitted in a separate paper not authored by Arthur O’Dwyer
(<a data-link-type="biblio" href="#biblio-p3516" title="Uninitialized algorithms for relocation">[P3516]</a>) which LEWG has approved for C++26. We are happy with this outcome.</p>
   </ul>
   <h2 class="heading settled" data-level="3" id="wording"><span class="secno">3. </span><span class="content">Proposed wording</span><a class="self-link" href="#wording"></a></h2>
   <p>The wording in this section is relative to the current Working Draft, <a data-link-type="biblio" href="#biblio-n5008" title="Working Draft — Programming Languages — C++">[N5008]</a>.</p>
   <h3 class="heading settled" data-level="3.1" id="wording-cpp.predefined"><span class="secno">3.1. </span><span class="content">[cpp.predefined]</span><a class="self-link" href="#wording-cpp.predefined"></a></h3>
   <p>Modify the feature-test macros in the table in <a href="https://eel.is/c++draft/cpp.predefined#tab:cpp.predefined.ft">[cpp.predefined]</a>:</p>
   <p><small></small></p>
   <blockquote>
    <p></p>
    <small> <pre class="highlight"><c- n>__cpp_impl_three_way_comparison</c->   <c- mf>201907L</c->
<ins><c- n>__cpp_impl_trivially_relocatable</c->  <c- n>YYYYMML</c-></ins>
<c- n>__cpp_implicit_move</c->               <c- mf>202207L</c->
</pre><p>[...]</p> <pre class="highlight"><c- n>__cpp_threadsafe_static_init</c->      <c- mf>200806L</c->
<del><c- n>__cpp_trivial_relocatability</c->      <c- mf>202502L</c-></del>
<c- n>__cpp_trivial_union</c->               <c- mf>202502L</c->
</pre></small>
   </blockquote>
   <h3 class="heading settled" data-level="3.2" id="wording-version.syn"><span class="secno">3.2. </span><span class="content">[version.syn]</span><a class="self-link" href="#wording-version.syn"></a></h3>
   <p>Bump the feature-test macro in <a href="https://eel.is/c++draft/version.syn">[version.syn]/2</a>:</p>
   <p><small></small></p>
   <blockquote>
    <p></p>
    <small> <pre class="highlight"><c- cp>#define __cpp_lib_transparent_operators             201510L </c-><c- c1>// freestanding, also in &lt;memory>, &lt;functional></c->
<c- cp>#define __cpp_lib_trivially_relocatable             </c-><del><c- cp>202502L</c-></del><c- cp> </c-><ins><c- cp>YYYYMML</c-></ins><c- cp> </c-><c- c1>// freestanding, also in &lt;memory>, &lt;type_traits></c->
<c- cp>#define __cpp_lib_tuple_element_t                   201402L </c-><c- c1>// freestanding, also in &lt;tuple></c->
</pre></small>
   </blockquote>
   <h3 class="heading settled" data-level="3.3" id="wording-basic.types.general"><span class="secno">3.3. </span><span class="content">[basic.types.general]</span><a class="self-link" href="#wording-basic.types.general"></a></h3>
   <p>Add a new section in <a href="http://eel.is/c++draft/basic.types.general">[basic.types.general]</a>:</p>
   <p><small></small></p>
   <blockquote><small> 9․ Arithmetic types ([basic.fundamental]), enumeration types, pointer types, pointer-to-member types ([basic.compound]), <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>nullptr_t</c-></code>, and cv-qualified versions of these types 
are collectively called <i>scalar types</i>.
Scalar types, trivially copyable class types ([class.prop]), arrays of such types, and cv-qualified versions of these types
are collectively called <i>trivially copyable types</i>.<p></p> <del>Scalar</del> <ins>Trivially copyable</ins> types, trivially relocatable class types (<a href="#wording-class.prop">[class.prop]</a>), arrays of such types, and cv-qualified versions of these types
are collectively called <i>trivially relocatable types</i>. <del>Cv-unqualified scalar types, replaceable class types ([class.prop]), and arrays of such types
are collectively called <i>replaceable types</i>.</del> Scalar types, standard-layout class types ([class.prop]), arrays of such types, and cv-qualified versions of these types
are collectively called <i>standard-layout types</i>.
Scalar types, implicit-lifetime class types ([class.prop]), array types, and cv-qualified versions of these types
are collectively called <i>implicit-lifetime types</i>. <p><ins>[<em>Note:</em> For a trivially relocatable type, object relocation operations
(as exemplified by <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>swap_ranges</c-></code> and <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>vector</c-><c- o>::</c-><c- n>reserve</c-></code>) are always tantamount
to simple copies of the underlying bytes. <em>—end note</em>]</ins> </p><p>10․ A type is a <i>literal type</i> if it is: [...]</p> </small></blockquote>
   <h3 class="heading settled" data-level="3.4" id="wording-class.pre"><span class="secno">3.4. </span><span class="content">[class.pre]</span><a class="self-link" href="#wording-class.pre"></a></h3>
   <p>Modify <a href="http://eel.is/c++draft/class.pre">[class.pre]</a> as follows:</p>
   <p><small></small></p>
   <blockquote><small> <i>class-property-specifier</i>:<br>   <code class="highlight"><c- k>final</c-></code><br>   <del><code class="highlight"><c- n>trivially_relocatable_if_eligible</c-></code></del><br>   <del><code class="highlight"><c- n>replaceable_if_eligible</c-></code></del><p></p> <p>[...]</p> <p>5․ Each <i>class-property-specifier</i> shall appear at most once within a single <i>class-property-specifier-seq</i>.
Whenever a <i>class-key</i> is followed by a <i>class-head-name</i>, the identifier <code class="highlight"><c- k>final</c-></code>, <del><code class="highlight"><c- n>trivially_relocatable_if_eligible</c-></code>, or <code class="highlight"><c- n>replaceable_if_eligible</c-></code>,</del> and a colon or left brace,
the identifier is interpreted as a <i>class-property-specifier</i>. </p><p>[<i>Example</i>:</p><pre class="highlight">  <c- k>struct</c-> <c- nc>A</c-><c- p>;</c->
  <c- k>struct</c-> <c- nc>A</c-> <c- k>final</c-> <c- p>{};</c->      <c- c1>// OK, definition of struct A,</c->
                          <c- c1>// not value-initialization of variable final</c->

<p><c- k>struct</c-> <c- nc>X</c-> <c- p>{</c->
   <c- k>struct</c-> <c- nc>C</c-> <c- p>{</c-> <c- k>constexpr</c-> <c- k>operator</c-> <c- b>int</c-><c- p>()</c-> <c- p>{</c-> <c- k>return</c-> <c- mi>5</c-><c- p>;</c-> <c- p>}</c-> <c- p>};</c->
   <c- k>struct</c-> <c- nc>B</c-> <del><c- n>trivially_relocatable_if_eligible</c-></del> <ins><c- k>final</c-></ins> <c- o>:</c-> <c- n>C</c-><c- p>{};</c->
                          <c- c1>// OK, definition of nested class B,</c->
                          <c- c1>// not declaration of a bit-field member</c->
                          <c- c1>// </c-><del><c- c1>trivially_relocatable_if_eligible</c-></del><c- c1> </c-><ins><c- c1>final</c-></ins>
  <c- p>};</c-></p>
</pre> —<i>end example</i>] </small></blockquote>
   <h3 class="heading settled" data-level="3.5" id="wording-class.prop"><span class="secno">3.5. </span><span class="content">[class.prop]</span><a class="self-link" href="#wording-class.prop"></a></h3>
   <p>Modify <a href="http://eel.is/c++draft/class.prop">[class.prop]</a> as follows:</p>
   <p><small></small></p>
   <blockquote>
    <p></p>
    <small> <p>1․ A <i>trivially copyable class</i> is a class: </p><ul><li data-md><p>that has at least one eligible copy constructor, move constructor, copy assignment operator, or move assignment operator ([special], [class.copy.ctor], [class.copy.assign]),</p> </li><li data-md><p>where each eligible copy constructor, move constructor, copy assignment operator, and move assignment operator is trivial, and</p> </li><li data-md><p>that has a trivial, non-deleted destructor ([class.dtor]).</p> </li></ul> <p><ins>x․ A <i>trivially relocatable class</i> is a class:</ins> </p><ul><li data-md><ins>where no eligible copy constructor, move constructor, copy assignment operator, move assignment operator, or destructor is user-provided,</ins> </li><li data-md><ins>that has no virtual member functions or virtual base classes,</ins> </li><li data-md><ins>all of whose non-static data members are either of reference type or of trivially relocatable type (<a href="#wording-basic.types.general">[basic.types.general]</a>), and</ins> </li><li data-md><ins>all of whose base classes are of trivially relocatable type;</ins> </li></ul> <ins>or a class that is declared with a <code class="highlight"><c- n>trivially_relocatable</c-></code> attribute with value <code class="highlight">true</code> (<a href="#wording-dcl.attr.trivreloc">[dcl.attr.trivreloc]</a>)
if that attribute is supported by the implementation (<a href="#wording-cpp.cond">[cpp.cond]</a>).</ins> <p><del>2․ A class <code class="highlight"><c- n>C</c-></code> is <i>default-movable</i> if</del> </p><ul><li data-md><del>overload resolution for direct-initializing an object of type <code class="highlight"><c- n>C</c-></code> from an xvalue of type <code class="highlight"><c- n>C</c-></code> selects a constructor that is a direct member of <code class="highlight"><c- n>C</c-></code> and is neither user-provided nor deleted,</del> </li><li data-md><del>overload resolution for assigning to an lvalue of type <code class="highlight"><c- n>C</c-></code> from an xvalue of type <code class="highlight"><c- n>C</c-></code> selects an assignment operator function that is a direct member of <code class="highlight"><c- n>C</c-></code> and is neither user-provided nor deleted, and</del> </li><li data-md><del><code class="highlight"><c- n>C</c-></code> has a destructor that is neither user-provided nor deleted.</del> </li></ul> <p><del>3․ A class is <i>eligible for trivial relocation</i> unless it</del> </p><ul><li data-md><del>has any virtual base classes,</del> </li><li data-md><del>has a base class that is not a trivially relocatable class,</del> </li><li data-md><del>has a non-static data member of an object type that is not of a trivially relocatable type, or</del> </li><li data-md><del>has a deleted destructor,</del> </li></ul> <del>except that it is implementation-defined whether an otherwise-eligible union having one or more subobjects of polymorphic class type
is eligible for trivial relocation.</del> <p><del>4․ A class <code class="highlight"><c- n>C</c-></code> is a <i>trivially relocatable class</i> if it is eligible for trivial relocation and</del> </p><ul><li data-md><del>has the <code class="highlight"><c- n>trivially_relocatable_if_eligible</c-></code> <i>class-property-specifier</i>,</del> </li><li data-md><del>is a union with no user-declared special member functions, or</del> </li><li data-md><del>is default-movable.</del> </li></ul> <p><del>5․ [<i>Note:</i> A class with const-qualified or reference non-static data members can be trivially relocatable. —<i>end note</i>]</del> </p><p><del>6․ A class <code class="highlight"><c- n>C</c-></code> is <i>eligible for replacement</i> unless</del> </p><ul><li data-md><del>it has a base class that is not a replaceable class,</del> </li><li data-md><del>it has a non-static data member that is not of a replaceable type,</del> </li><li data-md><del>overload resolution fails or selects a deleted constructor
when direct-initializing an object of type <code class="highlight"><c- n>C</c-></code> from an xvalue of type <code class="highlight"><c- n>C</c-></code> ([dcl.init.general]),</del> </li><li data-md><del>overload resolution fails or selects a deleted assignment operator function
when assigning to an lvalue of type <code class="highlight"><c- n>C</c-></code> from an xvalue of type <code class="highlight"><c- n>C</c-></code> ([expr.assign], [over.assign])), or</del> </li><li data-md><del>it has a deleted destructor.</del> </li></ul> <p><del>7․ A class <code class="highlight"><c- n>C</c-></code> is a <i>replaceable class</i> if it is eligible for replacement and</del> </p><ul><li data-md><del>has the <code class="highlight"><c- n>replaceable_if_eligible</c-></code> <i>class-property-specifier</i>,</del> </li><li data-md><del>is a union with no user-declared special member functions, or</del> </li><li data-md><del>is default-movable.</del> </li></ul> <p><del>8․ [<i>Note:</i> Accessibility of the special member functions is not considered when establishing trivial relocatability or replaceability. —<i>end note</i>]</del> </p><p><del>9․ [<i>Note:</i> Not all trivially copyable classes are trivially relocatable or replaceable. —<i>end note</i>]</del> </p><p>10․ A class <code class="highlight"><c- n>S</c-></code> is a <i>standard-layout class</i> if it: [...] </p></small>
   </blockquote>
   <h3 class="heading settled" data-level="3.6" id="wording-cpp.cond"><span class="secno">3.6. </span><span class="content">[cpp.cond]</span><a class="self-link" href="#wording-cpp.cond"></a></h3>
   <p>Add a new entry to the table of supported attributes in <a href="https://eel.is/c++draft/cpp.cond">[cpp.cond]</a>:</p>
   <p><small></small></p>
   <blockquote>
    <p></p>
    <small> <pre class="highlight"><c- n>noreturn</c->              <c- mf>200809L</c->
<ins><c- n>trivially_relocatable</c-> <c- n>YYYYMML</c-></ins>
<c- n>unlikely</c->              <c- mf>201803L</c->
</pre></small>
   </blockquote>
   <h3 class="heading settled" data-level="3.7" id="wording-dcl.attr.trivreloc"><span class="secno">3.7. </span><span class="content">[dcl.attr.trivreloc]</span><a class="self-link" href="#wording-dcl.attr.trivreloc"></a></h3>
   <p>Add a new section after <a href="http://eel.is/c++draft/dcl.attr.nouniqueaddr">[dcl.attr.nouniqueaddr]</a>:</p>
   <p><small></small></p>
   <blockquote>
    <p></p>
    <small> <p><ins>1․ The <em>attribute-token</em> <code class="highlight"><c- n>trivially_relocatable</c-></code> specifies that a class type’s relocation operation has no
visible side-effects other than a copy of the underlying bytes, as if by the library function <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>memcpy</c-></code>.
It may be applied to the definition of a class. It shall appear at most once in each <em>attribute-list</em>.
An <em>attribute-argument-clause</em> may be present and, if present, shall have the form</ins> </p><p></p><pre class="highlight">    <ins><c- p>(</c-> <i><c- n>constant</c-><c- o>-</c-><c- n>expression</c-></i> <c- p>)</c-></ins>
</pre> <p><ins>The <em>constant-expression</em> shall be an integral constant expression of type <code class="highlight"><c- b>bool</c-></code>.
If no <em>attribute-argument-clause</em> is present, it has the same effect as an <em>attribute-argument-clause</em> of <code class="highlight"><c- p>(</c->true<c- p>)</c-></code>.</ins> </p><p><ins>2․ If any definition of a class type has a <code class="highlight"><c- n>trivially_relocatable</c-></code> attribute with value <em>V</em>, then each
definition of the same class type shall have a <code class="highlight"><c- n>trivially_relocatable</c-></code> attribute with value <em>V</em>.
No diagnostic is required if definitions in different translation units have
mismatched <code class="highlight"><c- n>trivially_relocatable</c-></code> attributes.</ins> </p><p><ins>3․ If a class type is declared with the <code class="highlight"><c- n>trivially_relocatable</c-></code> attribute, and the program relies on
observable side-effects of its relocation other than a copy of the underlying bytes, the behavior is undefined.</ins> </p><p><ins>4․ <em>Recommended practice:</em> The value of a <i>has-attribute-expression</i> for
the <code class="highlight"><c- n>trivially_relocatable</c-></code> attribute should be <code class="highlight"><c- mi>0</c-></code> for a given implementation unless this attribute
can cause a class type to be trivially relocatable (<a href="#wording-class.prop">[class.prop]</a>).</ins> </p></small>
   </blockquote>
   <h3 class="heading settled" data-level="3.8" id="wording-expr.prim.lambda.closure"><span class="secno">3.8. </span><span class="content">[expr.prim.lambda.closure]</span><a class="self-link" href="#wording-expr.prim.lambda.closure"></a></h3>
   <p>Modify <a href="http://eel.is/c++draft/expr.prim.lambda.closure">[expr.prim.lambda.closure]</a> as follows:</p>
   <p><small></small></p>
   <blockquote>
    <p></p>
    <small> <p>3. The closure type is not an aggregate type ([dcl.init.aggr]);
it is a structural type ([temp.param]) if and only if the lambda has no <i>lambda-capture</i>.
An implementation may define the closure type differently from what is described below provided this does not alter
the observable behavior of the program other than by changing: </p><ul><li data-md><p>the size and/or alignment of the closure type,</p> </li><li data-md><p>whether the closure type is trivially copyable ([class.prop]),</p> </li><li data-md><p>whether the closure type is trivially relocatable ([class.prop]),</p> </li><li data-md><del>whether the closure type is replaceable ([class.prop]),</del> or </li><li data-md><p>whether the closure type is a standard-layout class ([class.prop]).</p> </li></ul> <p>An implementation shall not add members of rvalue reference type to the closure type.</p> </small>
   </blockquote>
   <h3 class="heading settled" data-level="3.9" id="wording-lex.name"><span class="secno">3.9. </span><span class="content">[lex.name]</span><a class="self-link" href="#wording-lex.name"></a></h3>
   <p>Modify <a href="http://eel.is/c++draft/lex.name">[lex.name]</a> as follows:</p>
   <p><small></small></p>
   <blockquote>
    <p></p>
    <small> <p>2. The identifiers in Table 4 have a special meaning when appearing in a certain context.
When referred to in the grammar, these identifiers are used explicitly rather than using the <i>identifier</i> grammar production. Unless otherwise specified, any ambiguity as to whether
a given <i>identifier</i> has a special meaning is resolved to interpret the token as a
regular <i>identifier</i>. </p><p>Table 4 — Identifiers with special meaning </p><pre class="highlight"><c- k>final</c->     <c- k>import</c->  <c- n>post</c->  <del><c- n>replaceable_if_eligible</c-></del>
<c- k>override</c->  <c- k>module</c->  <c- n>pre</c->   <del><c- n>trivially_relocatable_if_eligible</c-></del>
</pre></small>
   </blockquote>
   <h3 class="heading settled" data-level="3.10" id="wording-library.class.props"><span class="secno">3.10. </span><span class="content">[library.class.props]</span><a class="self-link" href="#wording-library.class.props"></a></h3>
   <p>Modify <a href="https://eel.is/c++draft/library.class.props">[library.class.props]</a> as follows:</p>
   <p><small></small></p>
   <blockquote>
    <p></p>
    <small> <p>1. Unless explicitly stated otherwise, it is unspecified whether any class described in [support] through [exec] and [depr]
is a trivially copyable class, <ins>a trivially relocatable class,</ins> a standard-layout class, or an implicit-lifetime class ([class.prop]). </p><p><del>2. Unless explicitly stated otherwise, it is unspecified whether any class for which trivial relocation
(i.e., the effects of <code class="highlight"><c- n>trivially_relocate</c-></code> ([obj.lifetime])) would be semantically equivalent to move-construction
of the destination object followed by destruction of the source object is a trivially relocatable class ([class.prop]).</del> </p><p><del>3. Unless explicitly stated otherwise, it is unspecified whether a class <code class="highlight"><c- n>C</c-></code> is a replaceable class ([class.prop])
if assigning an xvalue <code class="highlight"><c- n>a</c-></code> of type <code class="highlight"><c- n>C</c-></code> to an object <code class="highlight"><c- n>b</c-></code> of type <code class="highlight"><c- n>C</c-></code> is semantically equivalent to destroying <code class="highlight"><c- n>b</c-></code> and then
constructing from <code class="highlight"><c- n>a</c-></code> in <code class="highlight"><c- n>b</c-></code>’s place.</del> </p></small>
   </blockquote>
   <h3 class="heading settled" data-level="3.11" id="wording-meta.type.synop"><span class="secno">3.11. </span><span class="content">[meta.type.synop]</span><a class="self-link" href="#wording-meta.type.synop"></a></h3>
   <p>Modify <a href="http://eel.is/c++draft/meta.type.synop">[meta.type.synop]</a> as follows:</p>
   <p><small></small></p>
   <blockquote>
    <p></p>
    <small> <pre class="highlight"><c- p>[...]</c->
<i><c- c1>// </c-><a href="#wording-meta.unary.prop"><c- c1>[meta.unary.prop]</c-></a><c- c1>, type properties</c-></i>
<c- k>template</c-><c- o>&lt;</c-><c- k>class</c-> <c- nc>T</c-><c- o>></c-> <c- k>struct</c-> <c- nc>is_const</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>struct</c-> <c- nc>is_volatile</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>struct</c-> <c- nc>is_trivially_copyable</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>struct</c-> <c- nc>is_trivially_relocatable</c-><c- p>;</c->
<del><c- k>template</c-><c- o>&lt;</c-><c- k>class</c-> <c- nc>T</c-><c- o>></c-> <c- k>struct</c-> <c- nc>is_replaceable</c-><c- p>;</c-></del>
<c- k>template</c-><c- o>&lt;</c-><c- k>class</c-> <c- nc>T</c-><c- o>></c-> <c- k>struct</c-> <c- nc>is_standard_layout</c-><c- p>;</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>constexpr</c-> <c- b>bool</c-> <c- n>is_implicit_lifetime_v</c-> <c- o>=</c-> <c- n>is_implicit_lifetime</c-><c- o>&lt;</c-><c- n>T</c-><c- o>>::</c-><c- n>value</c-><c- p>;</c->
<del><c- k>template</c-><c- o>&lt;</c-><c- k>class</c-> <c- nc>T</c-><c- o>></c-></del>
  <del><c- k>constexpr</c-> <c- b>bool</c-> <c- n>is_replaceable_v</c-> <c- o>=</c-> <c- n>is_replaceable</c-><c- o>&lt;</c-><c- n>T</c-><c- o>>::</c-><c- n>value</c-><c- p>;</c-></del>
<c- k>template</c-><c- o>&lt;</c-><c- k>class</c-> <c- nc>T</c-><c- o>></c->
  <c- k>constexpr</c-> <c- b>bool</c-> <c- n>has_virtual_destructor_v</c-> <c- o>=</c-> <c- n>has_virtual_destructor</c-><c- o>&lt;</c-><c- n>T</c-><c- o>>::</c-><c- n>value</c-><c- p>;</c->
</pre></small>
   </blockquote>
   <h3 class="heading settled" data-level="3.12" id="wording-meta.unary.prop"><span class="secno">3.12. </span><span class="content">[meta.unary.prop]</span><a class="self-link" href="#wording-meta.unary.prop"></a></h3>
   <p>Modify Table 54 in <a href="http://eel.is/c++draft/meta.unary.prop">[meta.unary.prop]</a> as follows:</p>
   <p><small></small></p>
   <blockquote>
    <p></p>
    <small> <table> <tbody><tr><th>Template</th><th>Condition</th><th>Preconditions</th></tr> <tr> <td><code class="highlight"><c- k>template</c-><c- o>&lt;</c-><c- k>class</c-> <c- nc>T</c-><c- o>></c-> <c- k>struct</c-> <c- nc>is_trivially_copyable</c-><c- p>;</c-></code></td> <td><code class="highlight"><c- n>T</c-></code> is a trivially copyable type ([basic.types.general])</td> <td><code class="highlight"><c- n>remove_all_extents_t</c-><c- o>&lt;</c-><c- n>T</c-><c- o>></c-></code> shall be a complete type or <i>cv</i> <code class="highlight"><c- b>void</c-></code>.</td> </tr> <tr> <td><code class="highlight"><c- k>template</c-><c- o>&lt;</c-><c- k>class</c-> <c- nc>T</c-><c- o>></c-> <c- k>struct</c-> <c- nc>is_trivially_relocatable</c-><c- p>;</c-></code></td> <td><code class="highlight"><c- n>T</c-></code> is a trivially relocatable type (<a href="#wording-basic.types.general">[basic.types.general]</a>)</td> <td><code class="highlight"><c- n>remove_all_extents_t</c-><c- o>&lt;</c-><c- n>T</c-><c- o>></c-></code> shall be a complete type or <i>cv</i> <code class="highlight"><c- b>void</c-></code>.</td> </tr> <tr> <td><del><code class="highlight"><c- k>template</c-><c- o>&lt;</c-><c- k>class</c-> <c- nc>T</c-><c- o>></c-> <c- k>struct</c-> <c- nc>is_replaceable</c-><c- p>;</c-></code></del></td> <td><del><code class="highlight"><c- n>T</c-></code> is a replaceable type (<a href="#wording-basic.types.general">[basic.types.general]</a>)</del></td> <td><del><code class="highlight"><c- n>remove_all_extents_t</c-><c- o>&lt;</c-><c- n>T</c-><c- o>></c-></code> shall be a complete type or <i>cv</i> <code class="highlight"><c- b>void</c-></code>.</del></td> </tr> <tr> <td><code class="highlight"><c- k>template</c-><c- o>&lt;</c-><c- k>class</c-> <c- nc>T</c-><c- o>></c-> <c- k>struct</c-> <c- nc>is_standard_layout</c-><c- p>;</c-></code></td> <td><code class="highlight"><c- n>T</c-></code> is a standard-layout type ([basic.types.general])</td> <td><code class="highlight"><c- n>remove_all_extents_t</c-><c- o>&lt;</c-><c- n>T</c-><c- o>></c-></code> shall be a complete type or <i>cv</i> <code class="highlight"><c- b>void</c-></code>.</td> </tr> </tbody></table> </small>
   </blockquote>
   <h3 class="heading settled" data-level="3.13" id="wording-obj.lifetime"><span class="secno">3.13. </span><span class="content">[obj.lifetime]</span><a class="self-link" href="#wording-obj.lifetime"></a></h3>
   <p>Modify <a href="http://eel.is/c++draft/obj.lifetime">[obj.lifetime]</a> as follows:</p>
   <p><small></small></p>
   <blockquote>
    <p></p>
    <small> <pre class="highlight"><c- k>template</c-><c- o>&lt;</c-><c- k>class</c-> <c- nc>T</c-><c- o>></c->
  <c- n>T</c-><c- o>*</c-> <c- n>trivially_relocate</c-><c- p>(</c-><c- n>T</c-><c- o>*</c-> <c- n>first</c-><c- p>,</c-> <c- n>T</c-><c- o>*</c-> <c- n>last</c-><c- p>,</c-> <c- n>T</c-><c- o>*</c-> <c- n>result</c-><c- p>);</c->
</pre> <p>9. <em>Mandates:</em> <code class="highlight"><c- n>is_trivially_relocatable_v</c-><c- o>&lt;</c-><c- n>T</c-><c- o>></c-> <c- o>&amp;&amp;</c-> <c- o>!</c-><c- n>is_const_v</c-><c- o>&lt;</c-><c- n>T</c-><c- o>></c-></code> is <code class="highlight">true</code>. <code class="highlight"><c- n>T</c-></code> is not an array of unknown bound. </p><p>10. <em>Preconditions:</em> </p><ul><li data-md><p>[<code class="highlight"><c- n>first</c-></code>, <code class="highlight"><c- n>last</c-></code>) is a valid range.</p> </li><li data-md><p>[<code class="highlight"><c- n>result</c-></code>, <code class="highlight"><c- n>result</c-> <c- o>+</c-> <c- p>(</c-><c- n>last</c-> <c- o>-</c-> <c- n>first</c-><c- p>)</c-></code>) denotes a region of storage that is a subset of the region reachable through <code class="highlight"><c- n>result</c-></code> ([basic.compound])
and suitably aligned for the type <code class="highlight"><c- n>T</c-></code>.</p> </li><li data-md><p>No element in the range [<code class="highlight"><c- n>first</c-></code>, <code class="highlight"><c- n>last</c-></code>) is a potentially-overlapping subobject.</p> </li></ul> <p>11. <em>Postconditions:</em> No effect if <code class="highlight"><c- n>result</c-> <c- o>==</c-> <c- n>first</c-></code> is <code class="highlight">true</code>.
    Otherwise, the range denoted by [<code class="highlight"><c- n>result</c-></code>, <code class="highlight"><c- n>result</c-> <c- o>+</c-> <c- p>(</c-><c- n>last</c-> <c- o>-</c-> <c- n>first</c-><c- p>)</c-></code>) contains objects (including subobjects)
    whose lifetime has begun and whose object representations are the original object representations of the corresponding objects
    in the source range [<code class="highlight"><c- n>first</c-></code>, <code class="highlight"><c- n>last</c-></code>) <del>except for any parts of the object representations used by the implementation
    to represent type information ([intro.object])</del>. If any of the objects has union type, its active member is the same
    as that of the corresponding object in the source range. If any of the aforementioned objects has a non-static data member
    of reference type, that reference refers to the same entity as does the corresponding reference in the source range.
    The lifetimes of the original objects in the source range have ended. </p><p>12. <em>Returns:</em> <code class="highlight"><c- n>result</c-> <c- o>+</c-> <c- p>(</c-><c- n>last</c-> <c- o>-</c-> <c- n>first</c-><c- p>)</c-></code>. </p><p>13. <em>Throws:</em> Nothing. </p><p>14. <em>Complexity:</em> Linear in the length of the source range. </p><p>15. <em>Remarks:</em> The destination region of storage is considered reused ([basic.life]). No constructors or destructors are invoked. </p><p>[<i>Note:</i> Overlapping ranges are supported. —<i>end note</i>] </p></small>
   </blockquote>
   <h3 class="heading settled" data-level="3.14" id="wording-diff.cpp23.dcl.dcl"><span class="secno">3.14. </span><span class="content">[diff.cpp23.dcl.dcl]</span><a class="self-link" href="#wording-diff.cpp23.dcl.dcl"></a></h3>
   <p>Modify <a href="http://eel.is/c++draft/diff.cpp23.dcl.dcl">[diff.cpp23.dcl.dcl]</a> as follows:</p>
   <p><small></small></p>
   <blockquote>
    <p></p>
    <small> <p><del>1. Affected subclause: [dcl.decl.general]</del><br> <del>Change: Introduction of <code class="highlight"><c- n>trivially_relocatable_if_eligible</c-></code> and <code class="highlight"><c- n>replaceable_if_eligible</c-></code> as identifiers with special meaning ([lex.name]).</del><br> <del>Rationale: Support declaration of trivially relocatable and replaceable types ([class.prop]).</del><br> <del>Effect on original feature: Valid C++ 2023 code can become ill-formed.</del><br> </p><p><del>[<i>Example</i>:</del> </p><pre class="highlight"><del><c- k>struct</c-> <c- nc>C</c-> <c- p>{};</c-></del>
<del><c- k>struct</c-> <c- nc>C</c-> <c- n>replaceable_if_eligible</c-> <c- p>{};</c->    <c- c1>// was well-formed (new variable replaceable_if_eligible)</c-></del>
                                        <del><c- c1>// now ill-formed (redefines C)</c-></del>
</pre><del>—<i>end example</i>]</del> </small>
   </blockquote>
  </main>
<script>
(function() {
  "use strict";
  var collapseSidebarText = '<span aria-hidden="true">←</span> '
                          + '<span>Collapse Sidebar</span>';
  var expandSidebarText   = '<span aria-hidden="true">→</span> '
                          + '<span>Pop Out Sidebar</span>';
  var tocJumpText         = '<span aria-hidden="true">↑</span> '
                          + '<span>Jump to Table of Contents</span>';

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

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

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

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

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

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


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

    tocNav.appendChild(toggle);
  }

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

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

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

})();
</script>
  <h2 class="no-num no-ref heading settled" id="references"><span class="content">References</span><a class="self-link" href="#references"></a></h2>
  <h3 class="no-num no-ref heading settled" id="informative"><span class="content">Informative References</span><a class="self-link" href="#informative"></a></h3>
  <dl>
   <dt id="biblio-n5008">[N5008]
   <dd><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/n5008.pdf"><cite>Working Draft — Programming Languages — C++</cite></a>. March 2025. URL: <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/n5008.pdf">https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/n5008.pdf</a>
   <dt id="biblio-p1144r10">[P1144R10]
   <dd>Arthur O'Dwyer. <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p1144r10.html"><cite>std::is_trivially_relocatable</cite></a>. February 2024. URL: <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p1144r10.html">https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p1144r10.html</a>
   <dt id="biblio-p2786r13">[P2786R13]
   <dd>Pablo Halpern, Joshua Berne, Corentin Jabot, Pablo Halpern, Lori Hughes. <a href="https://wg21.link/p2786r13"><cite>Trivial Relocatability For C++26</cite></a>. 14 February 2025. URL: <a href="https://wg21.link/p2786r13">https://wg21.link/p2786r13</a>
   <dt id="biblio-p2786r4">[P2786R4]
   <dd>Mungo Gill, Alisdair Meredith. <a href="https://wg21.link/p2786r4"><cite>Trivial Relocatability For C++26</cite></a>. 9 February 2024. URL: <a href="https://wg21.link/p2786r4">https://wg21.link/p2786r4</a>
   <dt id="biblio-p2959">[P2959]
   <dd>Alisdair Meredith. <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2959r0.html"><cite>Relocation within containers</cite></a>. October 2023. URL: <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2959r0.html">https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2959r0.html</a>
   <dt id="biblio-p2967">[P2967]
   <dd>Alisdair Meredith; Mungo Gill. <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2967r1.pdf"><cite>Relocation has a library interface</cite></a>. May 2024. URL: <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2967r1.pdf">https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2967r1.pdf</a>
   <dt id="biblio-p3236">[P3236]
   <dd>Alan de Freitas; Daniel Liam Anderson; Giuseppe D'Angelo; Hans Goudey; Jacques Lucke; Krystian Stasiowski; Stéphane Janel; Thiago Maciera. <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3236r1.html"><cite>Please reject P2786 and adopt P1144</cite></a>. May 2024. URL: <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3236r1.html">https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3236r1.html</a>
   <dt id="biblio-p3516">[P3516]
   <dd>Louis Dionne; Giuseppe D'Angelo. <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3516r1.html"><cite>Uninitialized algorithms for relocation</cite></a>. February 2025. URL: <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3516r1.html">https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3516r1.html</a>
  </dl>