<!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>P2663R4: Interleaved complex values support in std::simd</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 74068a90b, updated Wed Mar 22 17:34:51 2023 -0700" name="generator">
  <link href="http://wg21.link/P2663R4.pdf" rel="canonical">
  <link href="https://isocpp.org/favicon.ico" rel="icon">
  <meta content="30e87f7dba0527bd0bac38209c570e184f747590" name="document-revision">
<style>
.ins, ins, ins * {
    background-color: rgb(200, 250, 200);
    color: rgb(0, 136, 0);
    text-decoration: none;
}
.span, span, span * {
    white-space: pre
}
</style>
<style>/* style-autolinks */
.css.css, .property.property, .descriptor.descriptor {
    color: var(--a-normal-text);
    font-size: inherit;
    font-family: inherit;
}
.css::before, .property::before, .descriptor::before {
    content: "‘";
}
.css::after, .property::after, .descriptor::after {
    content: "’";
}
.property, .descriptor {
    /* Don't wrap property and descriptor names */
    white-space: nowrap;
}
.type { /* CSS value <type> */
    font-style: italic;
}
pre .property::before, pre .property::after {
    content: "";
}
[data-link-type="property"]::before,
[data-link-type="propdesc"]::before,
[data-link-type="descriptor"]::before,
[data-link-type="value"]::before,
[data-link-type="function"]::before,
[data-link-type="at-rule"]::before,
[data-link-type="selector"]::before,
[data-link-type="maybe"]::before {
    content: "‘";
}
[data-link-type="property"]::after,
[data-link-type="propdesc"]::after,
[data-link-type="descriptor"]::after,
[data-link-type="value"]::after,
[data-link-type="function"]::after,
[data-link-type="at-rule"]::after,
[data-link-type="selector"]::after,
[data-link-type="maybe"]::after {
    content: "’";
}

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

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

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

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

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

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

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

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

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

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

    --heading-text: #005a9c;

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

    --algo-border: #def;

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

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

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

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

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

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

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

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

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

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

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

    --datacell-border: silver;

    --indexinfo-text: #707070;

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

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

    --editedrec-bg: darkorange;
}
</style>
<style>/* style-counters */
body {
    counter-reset: example figure issue;
}
.issue {
    counter-increment: issue;
}
.issue:not(.no-marker)::before {
    content: "Issue " counter(issue);
}

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

figcaption {
    counter-increment: figure;
}
figcaption:not(.no-marker)::before {
    content: "Figure " counter(figure) " ";
}
</style>
<style>/* style-issues */
a[href].issue-return {
    float: right;
    float: inline-end;
    color: var(--issueheading-text);
    font-weight: bold;
    text-decoration: none;
}
</style>
<style>/* style-md-lists */
/* This is a weird hack for me not yet following the commonmark spec
   regarding paragraph and lists. */
[data-md] > :first-child {
    margin-top: 0;
}
[data-md] > :last-child {
    margin-bottom: 0;
}
</style>
<style>/* style-selflinks */

:root {
    --selflink-text: white;
    --selflink-bg: gray;
    --selflink-hover-text: black;
}
.heading, .issue, .note, .example, li, dt {
    position: relative;
}
a.self-link {
    position: absolute;
    top: 0;
    left: calc(-1 * (3.5rem - 26px));
    width: calc(3.5rem - 26px);
    height: 2em;
    text-align: center;
    border: none;
    transition: opacity .2s;
    opacity: .5;
}
a.self-link:hover {
    opacity: 1;
}
.heading > a.self-link {
    font-size: 83%;
}
.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>/* 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 */
</style>
<style>/* style-darkmode */

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

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

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

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

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

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

        --heading-text: #8af;

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

        --algo-border: #456;

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

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

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

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

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

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

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

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

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

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

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

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

        --datacell-border: silver;

        --indexinfo-text: #aaa;

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

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

        --editedrec-bg: darkorange;
    }
    /* In case a transparent-bg image doesn't expect to be on a dark bg,
       which is quite common in practice... */
    img { background: white; }
}

@media (prefers-color-scheme: dark) {
    :root {
        --selflink-text: black;
        --selflink-bg: silver;
        --selflink-hover-text: white;
    }
}

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

    c-[a] { color: #d33682 } /* Keyword.Declaration */
    c-[b] { color: #d33682 } /* Keyword.Type */
    c-[c] { color: #2aa198 } /* Comment */
    c-[d] { color: #2aa198 } /* Comment.Multiline */
    c-[e] { color: #268bd2 } /* Name.Attribute */
    c-[f] { color: #b58900 } /* Name.Tag */
    c-[g] { color: #cb4b16 } /* Name.Variable */
    c-[k] { color: #d33682 } /* Keyword */
    c-[l] { color: #657b83 } /* Literal */
    c-[m] { color: #657b83 } /* Literal.Number */
    c-[n] { color: #268bd2 } /* Name */
    c-[o] { color: #657b83 } /* Operator */
    c-[p] { color: #657b83 } /* Punctuation */
    c-[s] { color: #6c71c4 } /* Literal.String */
    c-[t] { color: #6c71c4 } /* Literal.String.Single */
    c-[u] { color: #6c71c4 } /* Literal.String.Double */
    c-[ch] { color: #2aa198 } /* Comment.Hashbang */
    c-[cp] { color: #2aa198 } /* Comment.Preproc */
    c-[cpf] { color: #2aa198 } /* Comment.PreprocFile */
    c-[c1] { color: #2aa198 } /* Comment.Single */
    c-[cs] { color: #2aa198 } /* Comment.Special */
    c-[kc] { color: #d33682 } /* Keyword.Constant */
    c-[kn] { color: #d33682 } /* Keyword.Namespace */
    c-[kp] { color: #d33682 } /* Keyword.Pseudo */
    c-[kr] { color: #d33682 } /* Keyword.Reserved */
    c-[ld] { color: #657b83 } /* Literal.Date */
    c-[nc] { color: #268bd2 } /* Name.Class */
    c-[no] { color: #268bd2 } /* Name.Constant */
    c-[nd] { color: #268bd2 } /* Name.Decorator */
    c-[ni] { color: #268bd2 } /* Name.Entity */
    c-[ne] { color: #268bd2 } /* Name.Exception */
    c-[nf] { color: #268bd2 } /* Name.Function */
    c-[nl] { color: #268bd2 } /* Name.Label */
    c-[nn] { color: #268bd2 } /* Name.Namespace */
    c-[py] { color: #268bd2 } /* Name.Property */
    c-[ow] { color: #657b83 } /* Operator.Word */
    c-[mb] { color: #657b83 } /* Literal.Number.Bin */
    c-[mf] { color: #657b83 } /* Literal.Number.Float */
    c-[mh] { color: #657b83 } /* Literal.Number.Hex */
    c-[mi] { color: #657b83 } /* Literal.Number.Integer */
    c-[mo] { color: #657b83 } /* Literal.Number.Oct */
    c-[sa] { color: #6c71c4 } /* Literal.String.Affix */
    c-[sb] { color: #6c71c4 } /* Literal.String.Backtick */
    c-[sc] { color: #6c71c4 } /* Literal.String.Char */
    c-[dl] { color: #6c71c4 } /* Literal.String.Delimiter */
    c-[sd] { color: #6c71c4 } /* Literal.String.Doc */
    c-[se] { color: #6c71c4 } /* Literal.String.Escape */
    c-[sh] { color: #6c71c4 } /* Literal.String.Heredoc */
    c-[si] { color: #6c71c4 } /* Literal.String.Interpol */
    c-[sx] { color: #6c71c4 } /* Literal.String.Other */
    c-[sr] { color: #6c71c4 } /* Literal.String.Regex */
    c-[ss] { color: #6c71c4 } /* Literal.String.Symbol */
    c-[fm] { color: #268bd2 } /* Name.Function.Magic */
    c-[vc] { color: #cb4b16 } /* Name.Variable.Class */
    c-[vg] { color: #cb4b16 } /* Name.Variable.Global */
    c-[vi] { color: #cb4b16 } /* Name.Variable.Instance */
    c-[vm] { color: #cb4b16 } /* Name.Variable.Magic */
    c-[il] { color: #657b83 } /* Literal.Number.Integer.Long */
}
</style>
 <body class="h-entry">
  <div class="head">
   <p data-fill-with="logo"></p>
   <h1 class="p-name no-ref" id="title">P2663R4<br>Interleaved complex values support in std::simd</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="2023-10-13">2023-10-13</time></span></h2>
   <div data-fill-with="spec-metadata">
    <dl>
     <dt>This version:
     <dd><a class="u-url" href="http://wg21.link/P2663R4.pdf">http://wg21.link/P2663R4.pdf</a>
     <dt class="editor">Authors:
     <dd class="editor p-author h-card vcard"><a class="p-name fn u-email email" href="mailto:daniel.towner@intel.com">Daniel Towner</a> (<span class="p-org org">Intel</span>)
     <dd class="editor p-author h-card vcard"><a class="p-name fn u-email email" href="mailto:ruslan.arutyunyan@intel.com">Ruslan Arutyunyan</a> (<span class="p-org org">Intel</span>)
     <dt>Audience:
     <dd>LEWG
     <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>The paper proposes to support interleaved complex values in <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code></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">Motivation</span></a>
    <li><a href="#background"><span class="secno">2</span> <span class="content">Background</span></a>
    <li>
     <a href="#change_overview"><span class="secno">3</span> <span class="content">Overview of updates required to support <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-></code> simd elements</span></a>
     <ol class="toc">
      <li><a href="#base_modifications"><span class="secno">3.1</span> <span class="content"><code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> base modifications</span></a>
      <li>
       <a href="#additional_complex_methods"><span class="secno">3.2</span> <span class="content">Additional complex methods for <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code></span></a>
       <ol class="toc">
        <li><a href="#constructors"><span class="secno">3.2.1</span> <span class="content">Constructors</span></a>
        <li><a href="#accessors"><span class="secno">3.2.2</span> <span class="content">Real/imag accessors</span></a>
       </ol>
      <li>
       <a href="#free_functions"><span class="secno">3.3</span> <span class="content">Additional free functions</span></a>
       <ol class="toc">
        <li><a href="#real_imag_free_functions"><span class="secno">3.3.1</span> <span class="content">Alternative design for <code class="highlight"><c- n>real</c-></code> and <code class="highlight"><c- n>imag</c-></code></span></a>
       </ol>
     </ol>
    <li><a href="#implementation_experience"><span class="secno">4</span> <span class="content">Implementation experience</span></a>
    <li>
     <a href="#word"><span class="secno">5</span> <span class="content">Wording</span></a>
     <ol class="toc">
      <li><a href="#word_general"><span class="secno">5.1</span> <span class="content">Modify [<strong>simd.general</strong>]</span></a>
      <li><a href="#wording_default_init"><span class="secno">5.2</span> <span class="content">Modify [<strong>simd.summary</strong>]</span></a>
      <li><a href="#wording_ctor"><span class="secno">5.3</span> <span class="content">Modify [<strong>simd.ctor</strong>]</span></a>
      <li><a href="#wording_complex_accessors"><span class="secno">5.4</span> <span class="content">Add new section [<strong>simd.complex_accessors</strong>]</span></a>
      <li><a href="#wording_complex_library"><span class="secno">5.5</span> <span class="content">Add new section [<strong>simd.complex_math</strong>]</span></a>
     </ol>
    <li>
     <a href="#polls"><span class="secno">6</span> <span class="content">Polls</span></a>
     <ol class="toc">
      <li><a href="#kona_2022_sg1_polls"><span class="secno">6.1</span> <span class="content">Kona 2022 SG1 polls</span></a>
     </ol>
    <li><a href="#revision_history"><span class="secno">7</span> <span class="content">Revision History</span></a>
    <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">Motivation</span><a class="self-link" href="#intro"></a></h2>
   <p>ISO/IEC 19570:2018 (1) introduced data-parallel types to the C++ Extensions
for Parallelism TS. <a data-link-type="biblio" href="#biblio-p1928r6" title="std::simd - Merge data-parallel types from the Parallelism TS 2">[P1928R6]</a> is proposing to make that a part of C++ IS.
Intel supports the concept of a standard interface to SIMD instruction
capabilities and we have made extra suggestions for other APIs and facilities for <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> in document <a data-link-type="biblio" href="#biblio-p2638r0" title="Intel&apos;s response to P1915R0 for std::simd parallelism in TS 2">[P2638R0]</a>. One of the extra features we suggested was the
ability to work with interleaved complex values. It is now becoming common
for processor instruction sets to include native support for these operations
(e.g., Intel AVX512-FP16, ARM Neon) and we think that allowing <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> to
directly access these features is advantageous.</p>
   <p>This document gives more details about the motivation for supporting
complex-values, the different storage and implementation alternatives, and some
suggestions for a suitable API.</p>
   <h2 class="heading settled" data-level="2" id="background"><span class="secno">2. </span><span class="content">Background</span><a class="self-link" href="#background"></a></h2>
   <p>Complex-valued mathematics is widely used in scientific computing and many types
of engineering, with applications including physical simulations, wireless
signal processing, media processing, and much more besides. C++ already supports
complex-valued operations using the <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-></code> template available in the <code class="highlight"><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-></code> header file and C supports complex values by using the <code class="highlight"><c- n>_Complex</c-></code> keyword. C++ supports floating point elements, including <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>float16</c-></code> (C++23), <code class="highlight"><c- b>float</c-></code>, <code class="highlight"><c- b>double</c-></code> or <code class="highlight"><c- b>long</c-> <c- b>double</c-></code>,
though in practice compilers permit integer complex values too. Such is the
importance of interleaved complex values that some mainstream processor vendors
now provide native hardware support for complex-value SIMD instructions (e.g.,
Intel AVX512-FP16, ARM Neon v8.3).</p>
   <p>Any complex value is represented as a pair of values, one for the real component
and one for the imaginary component. In C and C++ a complex value is a pair of
two values of the appropriate data type, allocated to a single unit containing 2
elements which are stored contiguously. This is illustrated in the figure below.
This storage layout is used in other languages too, allowing for easy data
interchange between software written in different languages, or with comparable
user-defined types. This format may also be used for hardware accelerators or
interfaces too:</p>
   <p><img alt="…" src="data:image/jpeg;base64,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" width="40%"></p>
   <p>When many complex values are stored together, such as in a C-style array, a C++ <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>array</c-></code> or a C++ <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>vector</c-></code>, then the real and imaginary elements are
interleaved in memory:</p>
   <p><img alt="…" src="data:image/jpeg;base64,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" width="50%"></p>
   <p>Many applications, libraries, programming languages and interfaces between
diverse software and hardware components will store data in this interleaved format, and it
is treated as the default layout for blocks of complex-valued data. To improve
the compute efficiency of this data format both Intel and ARM have introduced
native hardware support to allow efficient SIMD operations to be performed in
this data format without having to resort to reformatting the data into a more
SIMD-amenable form. Where the underlying target hardware does not have native
support for interleaved complex values it is straight-forward to synthesize a
sequence of operations which give the same effect.</p>
   <p>Given the popularity of interleaved complex-values as a data exchange and
compute format we propose that <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> should be able to directly represent
this simd format in a form exemplified as:</p>
<pre class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>std</c-><c- o>::</c-><c- n>complex</c-><c- o>&lt;</c-><c- b>float</c-><c- o>></c-><c- p>,</c-> <c- mi>5</c-><c- o>></c->
<c- n>std</c-><c- o>::</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>std</c-><c- o>::</c-><c- n>complex</c-><c- o>&lt;</c-><c- b>double</c-><c- o>></c-><c- p>,</c-> <c- mi>9</c-><c- o>></c-></pre>
   <p>In all these cases the fundamental element type will be a suitable complex
value, and the individual components of each complex element will be worked on
as a single unit, according to the rules of complex arithmetic where
appropriate. This includes:</p>
   <ul>
    <li data-md>
     <p>All numeric operators (e.g., <code class="highlight"><c- o>+</c-></code>, <code class="highlight"><c- o>/</c-></code>, <code class="highlight"><c- o>-</c-></code>, <code class="highlight"><c- o>*</c-></code>) and their derivatives (e.g., assignment
operators) will operate as per their standard complex type definition. For
example, the multiply operator will invoke a complex multiply for each complex
element.</p>
    <li data-md>
     <p>Any numeric operation will apply the operation on a per-element basis,
generating a simd object of the same size as the input, but modifying the
element type to be the appropriate return type. For example, when applied to a <code class="highlight"><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>&lt;</c-><c- n>T</c-><c- o>>></c-></code>:</p>
     <ul>
      <li data-md>
       <p><code class="highlight"><c- n>exp</c-></code>, <code class="highlight"><c- n>sin</c-></code>, <code class="highlight"><c- n>log</c-></code>, <code class="highlight"><c- n>tan</c-></code>, <code class="highlight"><c- n>cos</c-></code> and so on will generate a <code class="highlight"><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>&lt;</c-><c- n>T</c-><c- o>>></c-></code></p>
      <li data-md>
       <p><code class="highlight"><c- n>abs</c-></code> or <code class="highlight"><c- n>norm</c-></code> will generate a <code class="highlight"><c- n>simd</c-><c- o>&lt;</c-><c- n>T</c-><c- o>></c-></code> (i.e., real-valued SIMD equivalent).</p>
     </ul>
     <p>Note that the mathematical behavior will also be applied appropriately (e.g.,
if a real or imaginary component is a NaN, then the complete operation for
a complex operation will also be NaN).</p>
    <li data-md>
     <p>The <code class="highlight"><c- n>simd_mask</c-></code> associated with a <code class="highlight"><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>&lt;</c-><c- n>T</c-><c- o>>></c-></code> will have each
individual mask bit refer to a complete complex element, not to
sub-components of the complex elements. When the <code class="highlight"><c- n>simd_mask</c-></code> is backed by a
compact representation (e.g., AVX-512), then each individual bit will refer
to a complete complex element. When the <code class="highlight"><c- n>simd_mask</c-></code> is backed by an element
mask (i.e., multiple bits filling a container of the same size as the simd
element) then the size of each bit element will be twice the size of the
underlying complex value type (e.g., a <code class="highlight"><c- n>simd_mask</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>&lt;</c-><c- n>_Float16</c-><c- o>>></c-></code> would be
equivalent to something like <code class="highlight"><c- n>simd</c-><c- o>&lt;</c-><c- b>uint32_t</c-><c- o>></c-></code>, since <code class="highlight"><c- k>sizeof</c-><c- p>(</c-><c- b>uint32_t</c-><c- p>)</c-> <c- o>==</c-> <c- mi>2</c-> <c- o>*</c-> <c- k>sizeof</c-><c- p>(</c-><c- n>_Float16</c-><c- p>)</c-></code>.</p>
    <li data-md>
     <p>Operations or functions which are invalid for complex values will be removed.
This includes relational operators (e.g., <code class="highlight"><c- o>&lt;</c-></code>, <code class="highlight"><c- o>&lt;=</c-></code>, <code class="highlight"><c- o>></c-></code>, <code class="highlight"><c- o>>=</c-></code>) and those derived
from them such, as <code class="highlight"><c- n>min</c-></code> or <code class="highlight"><c- n>max</c-></code>.</p>
    <li data-md>
     <p>Any operation which moves or reorders elements will move entire complex
values. For example, any sort of permute, resize, split, concat, insert,
extract or indexing operation works on complete complex elements as though
they are atomic units.</p>
    <li data-md>
     <p>Reduction operations apply at the level of complex values (this follows from
the previous bullet), provided the mathematical operation is valid (e.g.,
reduce-max would not be available).</p>
   </ul>
   <p>One of the aims of <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> is to make it possible to write a generic
code, which can use either a scalar type or a data-parallel type
interchangeably. To this end, <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> provides overloads of many of the
standard functions which operate in data-parallel mode. The same should apply to
a simd of complex values; it should be possible to write an algorithm which uses
either <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-><c- o>&lt;</c-><c- n>T</c-><c- o>></c-></code> or <code class="highlight"><c- n>simd</c-><c- o>&lt;</c-><c- n>std</c-><c- o>::</c-><c- n>complex</c-><c- o>&lt;</c-><c- n>T</c-><c- o>>></c-></code> with only a type replacement,
not with major API changes. To this end <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> should include some member
functions, such as real or imag, to mirror those found in std::complex.</p>
   <p>Note that an alternative way to create parallel complex values is to allow <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-></code> to use simd elements, such as <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-><c- o>&lt;</c-><c- n>simd</c-><c- o>&lt;</c-><c- b>float</c-><c- o>>></c-></code>.
This storage layout is called separated storage and discussion of this format is
outside the scope of this paper.</p>
   <h2 class="heading settled" data-level="3" id="change_overview"><span class="secno">3. </span><span class="content">Overview of updates required to support <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-></code> simd elements</span><a class="self-link" href="#change_overview"></a></h2>
   <p>There are three ways in which <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> needs to change to accommodate <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-></code> elements:</p>
   <ul>
    <li data-md>
     <p>Modify the definition of vectorizable types and the operations on them to
allow for complex elements. These modifications are small in nature and don’t
change the fundamental <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> API.</p>
    <li data-md>
     <p>Add a small number of methods to <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> to mimic those found in <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-></code>. These modifications allow a <code class="highlight"><c- n>std</c-><c- o>:::</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>&lt;</c-><c- n>T</c-><c- o>>></c-></code> value to be easily inserted into source code by text or template replacement
in place of a <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-></code> value without requiring a rewrite.</p>
    <li data-md>
     <p>Add a set of overloads and free functions to allow <code class="highlight"><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>&lt;</c-><c- n>T</c-><c- o>>></c-></code> to
reflect the different behaviors of complex (e.g., <code class="highlight"><c- n>sin</c-></code>, <code class="highlight"><c- n>cos</c-></code>, <code class="highlight"><c- n>exp</c-></code>, <code class="highlight"><c- n>log</c-></code>).</p>
   </ul>
   <p>Each of these points will now be discussed in more detail.</p>
   <h3 class="heading settled" data-level="3.1" id="base_modifications"><span class="secno">3.1. </span><span class="content"><code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> base modifications</span><a class="self-link" href="#base_modifications"></a></h3>
   <p>In its current definition, <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> allows the element type to be any
cv-unqualified arithmetic type other than bool. The first modification is to
extend the set of allowable element types to include any type which is valid for <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-></code>.</p>
   <p>Any simd operation or function which relies only on an element being an atomic
container which can be arbitrarily moved or duplicated as a single unit will
continue to operate as expected. For example, all the following will work on <code class="highlight"><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>&lt;</c-><c- n>T</c-><c- o>>></c-></code> without modification:</p>
   <ul>
    <li data-md>
     <p>Constructors or <code class="highlight"><c- n>copy_to</c-></code>/<code class="highlight"><c- n>copy_from</c-></code> functions for loading and storing values to and
from contiguous iterators</p>
    <li data-md>
     <p>Broadcast constructor</p>
    <li data-md>
     <p>Index operations</p>
    <li data-md>
     <p>Reordering operations, such as <code class="highlight"><c- n>simd_split</c-></code>, <code class="highlight"><c- n>simd_cat</c-></code>, <code class="highlight"><c- n>permute</c-></code>, <code class="highlight"><c- n>resize</c-></code>, <code class="highlight"><c- n>insert</c-></code> and <code class="highlight"><c- n>extract</c-></code>.</p>
    <li data-md>
     <p>Masking selection operations (using a mask to include or exclude values from an operation or copy).</p>
   </ul>
   <p><code class="highlight"><c- n>simd_mask</c-></code>’s of complex values do not need to have any special behaviour since the mask
is simply a collection of boolean values, and the underlying element type makes no difference.</p>
   <p>Constructors, including generator functions, which work on atomic units (e.g.,
broadcasting constructor) will work without modification. Note that the existing
broadcast constructor will already permit a real-valued object to be used in a
broadcast, since an individual value may be converted to a complex value with a
zero imaginary:</p>
<pre class="language-cpp highlight"><c- k>auto</c-> <c- n>x</c-> <c- o>=</c-> <c- n>simd</c-><c- o>&lt;</c-><c- n>std</c-><c- o>::</c-><c- n>complex</c-><c- o>&lt;</c-><c- b>float</c-><c- o>>></c-><c- p>(</c-><c- mf>3.14f</c-><c- p>);</c->
<c- c1>// [3.14 + 0i, 3.14 + 0i, ...]</c-></pre>
   <p>Numeric operations (binary, unary, and compound-assignment) are mostly covered by <a data-link-type="biblio" href="#biblio-p1928r6" title="std::simd - Merge data-parallel types from the Parallelism TS 2">[P1928R6]</a> remark:</p>
   <p><i>A simd object initialized with the results of applying the indicated operator to</i> <code class="highlight"><c- n>lhs</c-></code> <i>and</i> <code class="highlight"><c- n>rhs</c-></code> <i>as a binary element-wise operation</i></p>
   <p>In the case of complex values this has the practical effect of ensuring that
operators will perform their complex operations without changing the definition
of <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> (e.g., <code class="highlight"><c- k>operator</c-><c- o>*</c-></code> will perform complex-valued
multiplication). Furthermore, <a data-link-type="biblio" href="#biblio-p1928r6" title="std::simd - Merge data-parallel types from the Parallelism TS 2">[P1928R6]</a> notes that constraints will be applied
as necessary on operators and functions:</p>
   <p><i>Constraints: Application of the indicated  operator to objects of type <code class="highlight"><c- n>T</c-></code> is well-formed.</i></p>
   <p>This will ensure that operators which are not permitted for complex numbers
(e.g., <code class="highlight"><c- k>operator</c-><c- o>%</c-></code>, <code class="highlight"><c- k>operator</c-><c- o>&lt;&lt;</c-></code>, <code class="highlight"><c- k>operator</c-><c- o>&amp;</c-></code>) will be removed from
the overload set, as will functions which rely on these operators (e.g., <code class="highlight"><c- n>min</c-></code>, <code class="highlight"><c- n>max</c-></code>, <code class="highlight"><c- n>clamp</c-></code>).</p>
   <h3 class="heading settled" data-level="3.2" id="additional_complex_methods"><span class="secno">3.2. </span><span class="content">Additional complex methods for <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code></span><a class="self-link" href="#additional_complex_methods"></a></h3>
   <p>It is desirable for <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> to be source- or template-replaceable with
respect to its underlying element type. For example, given a simple code
fragment which works with <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-></code>:</p>
<pre class="language-cpp highlight"><c- k>auto</c-> <c- n>my_fn</c-><c- p>(</c-><c- k>auto</c-> <c- n>cmplx_value</c-><c- p>)</c->
<c- p>{</c->
    <c- n>std</c-><c- o>::</c-><c- n>complex</c-><c- o>&lt;</c-><c- b>float</c-><c- o>></c-> <c- n>rotator</c-> <c- p>(</c-><c- mi>0</c-><c- p>,</c-> <c- mi>1</c-><c- p>);</c->
    <c- k>return</c-> <c- p>(</c-><c- n>cmplx_value</c-> <c- o>*</c-> <c- n>rotator</c-><c- p>).</c-><c- n>real</c-><c- p>();</c->
<c- p>}</c-></pre>
   <p>In this example the function will work with a <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-><c- o>&lt;</c-><c- b>float</c-><c- o>></c-></code> input. Ideally
it should also work with an input of type <code class="highlight"><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>&lt;</c-><c- b>float</c-><c- o>>></c-></code>. For this to happen,
firstly the <code class="highlight"><c- k>operator</c-><c- o>*</c-></code> must work with a scalar value, and secondly it should be
possible for the <code class="highlight"><c- n>real</c-><c- p>()</c-></code> method to be invoked on a <code class="highlight"><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>&lt;</c-><c- n>T</c-><c- o>>></c-></code> value.</p>
   <p><code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-></code> provides a number of member functions:</p>
   <ul>
    <li data-md>
     <p>Constructors</p>
    <li data-md>
     <p><code class="highlight"><c- k>operator</c-><c- o>=</c-></code> (assignment)</p>
    <li data-md>
     <p><code class="highlight"><c- k>operator</c-><c- o>+=</c-></code>, <code class="highlight"><c- k>operator</c-><c- o>-=</c-></code>, <code class="highlight"><c- k>operator</c-><c- o>*=</c-></code>, <code class="highlight"><c- k>operator</c-><c- o>/=</c-></code></p>
    <li data-md>
     <p><code class="highlight"><c- n>real</c-></code></p>
    <li data-md>
     <p><code class="highlight"><c- n>imag</c-></code></p>
   </ul>
   <p>The assignment operator and the compound-assignment operators are already
provided by <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> so no further action is required. The remaining member
functions that are required are considered in the following sub-sections.</p>
   <h4 class="heading settled" data-level="3.2.1" id="constructors"><span class="secno">3.2.1. </span><span class="content">Constructors</span><a class="self-link" href="#constructors"></a></h4>
   <p>Conversion and copy methods already exist in <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> and can be used for
complex SIMD values. An additional constructor is needed to match the <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-></code> constructor which can build a complex value from separate
real and imaginary components: constructed from real and imaginary simd values.</p>
<pre class="language-cpp highlight"><c- k>requires</c-> <c- n>is_complex_number</c-><c- o>&lt;</c-><c- n>T</c-><c- o>></c->
<c- k>constexpr</c-> <c- n>basic_simd</c-><c- p>(</c-><c- k>const</c-> <c- n>basic_simd</c-><c- o>&lt;</c-><c- n>T</c-><c- o>::</c-><c- n>value_type</c-><c- p>,</c-> <c- n>UAbi</c-><c- o>>&amp;</c-> <c- n>r</c-> <c- o>=</c-> <c- p>{},</c->
                     <c- k>const</c-> <c- n>basic_simd</c-><c- o>&lt;</c-><c- n>T</c-><c- o>::</c-><c- n>value_type</c-><c- p>,</c-> <c- n>UAbi</c-><c- o>>&amp;</c-> <c- n>i</c-> <c- o>=</c-> <c- p>{})</c-></pre>
   <p>This constructor is constrained so that it can only be used for SIMD values with
complex elements (some suitable concept will be added to enforce this). Like its <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-></code> counterpart it can be used to build a complex value from real
components only, with insertion of zero imaginaries. This constructor can be used
as in the following example:</p>
<pre class="language-cpp highlight"><c- n>simd</c-><c- o>&lt;</c-><c- b>float</c-><c- p>,</c-> <c- mi>8</c-><c- o>></c-> <c- n>reals</c-> <c- o>=</c-> <c- p>...;</c->
<c- n>simd</c-><c- o>&lt;</c-><c- b>float</c-><c- p>,</c-> <c- mi>8</c-><c- o>></c-> <c- n>imaginaries</c-> <c- o>=</c-> <c- p>...;</c->

<c- c1>// Create a real-valued complex number (i.e., zero imaginaries)</c->
<c- n>simd</c-><c- o>&lt;</c-><c- n>std</c-><c- o>::</c-><c- n>complex</c-><c- o>&lt;</c-><c- b>float</c-><c- o>></c-><c- p>,</c-> <c- mi>8</c-><c- o>></c-> <c- n>realAsComplex</c-> <c- p>(</c-><c- n>reals</c-><c- p>);</c->

<c- c1>// Create a complex value from real and imaginary simd inputs</c->
<c- n>simd</c-><c- o>&lt;</c-><c- n>std</c-><c- o>::</c-><c- n>complex</c-><c- o>&lt;</c-><c- b>float</c-><c- o>></c-><c- p>,</c-> <c- mi>8</c-><c- o>></c-> <c- n>cmplx</c-> <c- p>(</c-><c- n>reals</c-><c- p>,</c-> <c- n>imaginaries</c-><c- p>);</c-></pre>
   <h4 class="heading settled" data-level="3.2.2" id="accessors"><span class="secno">3.2.2. </span><span class="content">Real/imag accessors</span><a class="self-link" href="#accessors"></a></h4>
   <p>It should be possible to separately read or write the real and imaginary
components. For example, given a simd of <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-><c- o>&lt;</c-><c- b>float</c-><c- o>></c-></code> values, the real
components of the simd will be extracted as a value of type <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-><c- o>&lt;</c-><c- b>float</c-><c- o>></c-></code> instead.
Similarly, given a <code class="highlight"><c- n>simd</c-><c- o>&lt;</c-><c- b>float</c-><c- o>></c-></code> value those values can be inserted into the simd
as the real components of each respective value.</p>
   <p>The read accessors for <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-></code> come in two variants: a free function,
and a member function. These would be defined in <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> as follows:</p>
<pre class="language-cpp highlight"><c- c1>// Free functions for accessing real/imaginary components</c->
<c- k>template</c-> <c- o>&lt;</c-><c- k>typename</c-> <c- nc>T</c-><c- p>,</c-> <c- k>typename</c-> <c- nc>ABI</c-><c- o>></c-> <c- k>constexpr</c-> <c- k>auto</c-> <c- n>real</c-><c- p>(</c-><c- k>const</c-> <c- n>basic_simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>&lt;</c-><c- n>T</c-><c- o>></c-><c- p>,</c-> <c- n>ABI</c-><c- o>>&amp;</c-><c- p>);</c->
<c- k>template</c-> <c- o>&lt;</c-><c- k>typename</c-> <c- nc>T</c-><c- p>,</c-> <c- k>typename</c-> <c- nc>ABI</c-><c- o>></c-> <c- k>constexpr</c-> <c- k>auto</c-> <c- n>imag</c-><c- p>(</c-><c- k>const</c-> <c- n>basic_simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>&lt;</c-><c- n>T</c-><c- o>></c-><c- p>,</c-> <c- n>ABI</c-><c- o>>&amp;</c-><c- p>);</c->

<c- c1>// Member functions of std::simd for accessing real/imaginary components.</c->
<c- k>constexpr</c-> <c- n>simd</c-><c- o>&lt;</c-><c- n>T</c-><c- p>,</c-> <c- n>size</c-><c- p>()</c-><c- o>></c-> <c- n>std</c-><c- o>::</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>std</c-><c- o>::</c-><c- n>complex</c-><c- o>&lt;</c-><c- n>T</c-><c- o>>>::</c-><c- n>real</c-><c- p>()</c-> <c- k>const</c-><c- p>;</c->
<c- k>constexpr</c-> <c- n>simd</c-><c- o>&lt;</c-><c- n>T</c-><c- p>,</c-> <c- n>size</c-><c- p>()</c-><c- o>></c-> <c- n>std</c-><c- o>::</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>std</c-><c- o>::</c-><c- n>complex</c-><c- o>&lt;</c-><c- n>T</c-><c- o>>>::</c-><c- n>imag</c-><c- p>()</c-> <c- k>const</c-><c- p>;</c-></pre>
   <p>The write accessors for <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-></code> are provided as member functions
which allow the real and imaginary components of an existing complex value to be
overwritten.</p>
<pre class="language-cpp// highlight"><c- k>template</c-><c- o>&lt;</c-><c- k>typename</c-> <c- nc>T</c-><c- p>,</c-> <c- k>typename</c-> <c- nc>ABI</c-><c- o>></c->
<c- k>constexpr</c-> <c- b>void</c-> <c- n>real</c-><c- p>(</c-><c- k>const</c-> <c- n>basic_simd</c-><c- o>&lt;</c-><c- n>T</c-><c- p>,</c-> <c- n>ABI</c-><c- o>>&amp;</c-> <c- n>reals</c-><c- p>);</c->

<c- k>template</c-><c- o>&lt;</c-><c- k>typename</c-> <c- nc>T</c-><c- p>,</c-> <c- k>typename</c-> <c- nc>ABI</c-><c- o>></c->
<c- k>constexpr</c-> <c- b>void</c-> <c- n>imag</c-><c- p>(</c-><c- k>const</c-> <c- n>basic_simd</c-><c- o>&lt;</c-><c- n>T</c-><c- p>,</c-> <c- n>ABI</c-><c- o>>&amp;</c-> <c- n>reals</c-><c- p>);</c-></pre>
   <p>The advantage of making <code class="highlight"><c- n>real</c-></code> and <code class="highlight"><c- n>imag</c-></code> members of <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> is an API consistency
between <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-><c- o>&lt;</c-><c- n>T</c-><c- o>></c-></code> and <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>std</c-><c- o>::</c-><c- n>complex</c-><c- o>&lt;</c-><c- n>T</c-><c- o>>></c-></code> for both getters and setters
A disadvantage though is the <code class="highlight"><c- n>real</c-></code> and <code class="highlight"><c- n>imag</c-></code> seem too specific to be provided for <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code>.
Please see <a href="#real_imag_free_functions">§ 3.3.1 Alternative design for real and imag</a> for more design considerations.</p>
   <h3 class="heading settled" data-level="3.3" id="free_functions"><span class="secno">3.3. </span><span class="content">Additional free functions</span><a class="self-link" href="#free_functions"></a></h3>
   <p>The free functions for <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-></code> include numeric operators, such as <code class="highlight"><c- o>+</c-></code>, <code class="highlight"><c- o>-</c-></code>, <code class="highlight"><c- o>*</c-></code> and <code class="highlight"><c- o>/</c-></code>. These are already proposed in <a data-link-type="biblio" href="#biblio-p1928r6" title="std::simd - Merge data-parallel types from the Parallelism TS 2">[P1928R6]</a> and need not be considered
further.</p>
   <p>The remaining free functions which should be specialized for <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>&lt;</c-><c- n>T</c-><c- o>>></c-></code> include:</p>
   <table class="def">
    <tbody>
     <tr>
      <th><code class="highlight"><c- n>real</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>returns the real part 
     <tr>
      <th><code class="highlight"><c- n>imag</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>returns the imaginary part 
     <tr>
      <th><code class="highlight"><c- n>abs</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>returns the magnitude of a complex number 
     <tr>
      <th><code class="highlight"><c- n>arg</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>returns the phase angle 
     <tr>
      <th><code class="highlight"><c- n>norm</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>returns the squared magnitude 
     <tr>
      <th><code class="highlight"><c- n>conj</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>returns the complex conjugate 
     <tr>
      <th><code class="highlight"><c- n>proj</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>returns the projection onto the Riemann sphere 
     <tr>
      <th><code class="highlight"><c- n>polar</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>constructs a complex number from magnitude and phase angle 
     <tr>
      <th><code class="highlight"><c- n>exp</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>complex base e exponential 
     <tr>
      <th><code class="highlight"><c- n>log</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>complex natural logarithm with the branch cuts along the negative real axis 
     <tr>
      <th><code class="highlight"><c- n>log10</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>complex common logarithm with the branch cuts along the negative real axis 
     <tr>
      <th><code class="highlight"><c- n>pow</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>complex power, one or both arguments may be a complex number 
     <tr>
      <th><code class="highlight"><c- n>sqrt</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>complex square root in the range of the right half-plane 
     <tr>
      <th><code class="highlight"><c- n>sin</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>computes sine of a complex number 
     <tr>
      <th><code class="highlight"><c- n>cos</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>computes cosine of a complex number 
     <tr>
      <th><code class="highlight"><c- n>tan</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>computes tangent of a complex numbe 
     <tr>
      <th><code class="highlight"><c- n>asin</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>computes arc sine of a complex number 
     <tr>
      <th><code class="highlight"><c- n>acos</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>computes arc cosine of a complex number 
     <tr>
      <th><code class="highlight"><c- n>atan</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>computes arc tangent of a complex number 
     <tr>
      <th><code class="highlight"><c- n>sinh</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>computes hyperbolic sine of a complex number 
     <tr>
      <th><code class="highlight"><c- n>cosh</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>computes hyperbolic cosine of a complex number 
     <tr>
      <th><code class="highlight"><c- n>tanh</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>computes hyperbolic tangent of a complex number 
     <tr>
      <th><code class="highlight"><c- n>asinh</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>computes area hyperbolic sine of a complex number 
     <tr>
      <th><code class="highlight"><c- n>acosh</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>computes area hyperbolic cosine of a complex number 
     <tr>
      <th><code class="highlight"><c- n>atanh</c-><c- p>(</c-><c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-><c- p>)</c-></code>
      <td>computes area hyperbolic tangent of a complex number 
   </table>
   <p>All of these functions should operate element-wise in the same way as their
scalar counterparts. Note that although most of these functions take complex
inputs and generate complex outputs, some of these functions generate
real-valued outputs (e.g., <code class="highlight"><c- n>abs</c-></code> returns the magnitude, which is real-valued), or
accept an input which is real-valued (e.g., <code class="highlight"><c- n>conj</c-></code> can accept a real-valued value
and return a complex value).</p>
   <h4 class="heading settled" data-level="3.3.1" id="real_imag_free_functions"><span class="secno">3.3.1. </span><span class="content">Alternative design for <code class="highlight"><c- n>real</c-></code> and <code class="highlight"><c- n>imag</c-></code></span><a class="self-link" href="#real_imag_free_functions"></a></h4>
   <p>Instead of making <code class="highlight"><c- n>real</c-></code> and <code class="highlight"><c- n>imag</c-></code> member functions we could provide them
only as free functions. Free function getters are already included in the
proposal, but the setters would be removed as member functions and replaced by
the following:</p>
<pre class="language-cpp highlight"><c- c1>// Setters</c->
<c- k>template</c-> <c- o>&lt;</c-><c- k>typename</c-> <c- nc>T</c-><c- p>,</c-> <c- k>typename</c-> <c- nc>AbiC</c-><c- p>,</c-> <c- k>typename</c-> <c- nc>AbiR</c-><c- o>></c->
<c- b>void</c-> <c- n>real</c-><c- p>(</c-><c- n>basic_simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>&lt;</c-><c- n>T</c-><c- o>></c-><c- p>,</c-> <c- n>AbiC</c-><c- o>>&amp;</c-><c- p>,</c-> <c- n>basic_simd</c-><c- o>&lt;</c-><c- n>T</c-><c- p>,</c-> <c- n>AbiC</c-><c- o>></c-><c- p>);</c->

<c- k>template</c-> <c- o>&lt;</c-><c- k>typename</c-> <c- nc>T</c-><c- p>,</c-> <c- k>typename</c-> <c- nc>AbiC</c-><c- p>,</c-> <c- k>typename</c-> <c- nc>AbiR</c-><c- o>></c->
<c- b>void</c-> <c- n>imag</c-><c- p>(</c-><c- n>basic_simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>&lt;</c-><c- n>T</c-><c- o>></c-><c- p>,</c-> <c- n>AbiC</c-><c- o>>&amp;</c-><c- p>,</c-> <c- n>basic_simd</c-><c- o>&lt;</c-><c- n>T</c-><c- p>,</c-> <c- n>AbiR</c-><c- o>></c-><c- p>);</c-></pre>
   <p>The member function getters would also be removed.</p>
   <p>The advantage of that approach is it keeps <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-></code> specific functions outside of <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> class. The disadvantage though is inconsistency with existing <code class="highlight"><c- n>real</c-></code> and <code class="highlight"><c- n>imag</c-></code> free functions for <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-></code>, which allow reading only.
Please see <a href="#accessors">§ 3.2.2 Real/imag accessors</a> for initial design.</p>
   <p>We would like to hear the feedback of C++ standard committee what design looks more appropriate.</p>
   <h2 class="heading settled" data-level="4" id="implementation_experience"><span class="secno">4. </span><span class="content">Implementation experience</span><a class="self-link" href="#implementation_experience"></a></h2>
   <p>Intel have written an example implementation of <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> which includes
the extensions to support interleaved complex values. We have been able to
generate efficient code both on targets with native support (e.g., AVX512_FP16),
and also on targets without native support which require synthesized code
sequences.</p>
   <h2 class="heading settled" data-level="5" id="word"><span class="secno">5. </span><span class="content">Wording</span><a class="self-link" href="#word"></a></h2>
   <p>The wording relies on <a data-link-type="biblio" href="#biblio-p1928r6" title="std::simd - Merge data-parallel types from the Parallelism TS 2">[P1928R6]</a> being landed to the Working Draft. Below,
substitute the � character with a number the editor finds appropriate for the
table, paragraph, section or sub-section.</p>
   <h3 class="heading settled" data-level="5.1" id="word_general"><span class="secno">5.1. </span><span class="content">Modify [<strong>simd.general</strong>]</span><a class="self-link" href="#word_general"></a></h3>
   <p>�:	The set of <em>vectorizable</em> types comprises all cv-unqualified arithmetic types other than <code class="highlight"><c- b>bool</c-></code></p>
   <ins>, and <code>std::complex&lt;></code> specializations.</ins>
   . 
   <h3 class="heading settled" data-level="5.2" id="wording_default_init"><span class="secno">5.2. </span><span class="content">Modify [<strong>simd.summary</strong>]</span><a class="self-link" href="#wording_default_init"></a></h3>
   <p>
    �:	Default intialization performs no initialization of the elements
    <ins>,
except when the value type is a <code>std::complex&lt;></code> specialization in which case all
elements will be value-initialized</ins>
    ; value-initialization initializes each
element with <code class="highlight"><c- n>T</c-><c- p>()</c-></code>.
   </p>
   <h3 class="heading settled" data-level="5.3" id="wording_ctor"><span class="secno">5.3. </span><span class="content">Modify [<strong>simd.ctor</strong>]</span><a class="self-link" href="#wording_ctor"></a></h3>
   <blockquote> <b><span>� <code class="highlight"><c- n>simd</c-></code> constructors        [<strong>simd.ctor</strong>]</span></b> <br>[...]<br> </blockquote>
   <ins>
    <blockquote>
<pre class="highlight"><c- k>template</c-><c- o>&lt;</c-><c- k>typename</c-> <c- nc>CAbi</c-><c- o>></c->
<c- k>constexpr</c-> <c- k>explicit</c->
<c- n>basic_simd</c-><c- p>(</c-><c- k>const</c-> <c- n>basic_simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>-</c-><c- n>element</c-><c- o>-</c-><c- n>type</c-><c- p>,</c-> <c- n>CAbi</c-><c- o>></c-> <c- n>reals</c-> <c- o>=</c-> <c- p>{},</c->
           <c- k>const</c-> <c- n>basic_simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>-</c-><c- n>element</c-><c- o>-</c-><c- n>type</c-><c- p>,</c-> <c- n>CAbi</c-><c- o>></c-> <c- n>imags</c-> <c- o>=</c-> <c- p>{});</c-></pre>
     <p>Constraints:</p>
     <ul>
      <li data-md>
       <p>The <code class="highlight"><c- n>value_type</c-></code> is a complex value (i.e., some specialization of <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-><c- o>&lt;></c-></code>).</p>
      <li data-md>
       <p>The <code class="highlight"><c- n>complex</c-><c- o>-</c-><c- n>element</c-><c- o>-</c-><c- n>type</c-></code> is the same as <code class="highlight"><c- n>T</c-><c- o>::</c-><c- n>value_type</c-></code> (where T is the simd’s own <code class="highlight"><c- n>value_type</c-></code>).</p>
      <li data-md>
       <p><code class="highlight"><c- n>basic_simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>-</c-><c- n>element</c-><c- o>-</c-><c- n>type</c-><c- p>,</c-> <c- n>CAbi</c-><c- o>>::</c-><c- n>size</c-></code> is equal to <code class="highlight"><c- n>basic_simd</c-><c- o>::</c-><c- n>size</c-></code>.</p>
     </ul>
     <p>Effects:</p>
     <ul>
      <li data-md>
       <p>Construct a simd of elements of type <code class="highlight"><c- n>value_type</c-></code> (where <code class="highlight"><c- n>value_type</c-></code> is a
specialization of <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-><c- o>&lt;></c-></code>), such that the i<sup>th</sup> element
is equal to the object constructed as <code class="highlight"><c- n>value_type</c-><c- p>(</c-><c- n>reals</c-><c- p>[</c-><c- n>i</c-><c- p>],</c-> <c- n>imags</c-><c- p>[</c-><c- n>i</c-><c- p>])</c-></code> for all i in the range <code class="highlight"><c- p>[</c-><c- mf>0.</c-><c- p>.</c-><c- n>size</c-><c- p>)</c-></code>.</p>
     </ul>
     <p>Remarks:</p>
     <ul>
      <li data-md>
       <p>Where no parameter values are provided this function acts as
default initializer which value-initializes all real and imaginary elements.</p>
     </ul>
    </blockquote>
   </ins>
   <h3 class="heading settled" data-level="5.4" id="wording_complex_accessors"><span class="secno">5.4. </span><span class="content">Add new section [<strong>simd.complex_accessors</strong>]</span><a class="self-link" href="#wording_complex_accessors"></a></h3>
   <ins>
    <blockquote>
      <b><span class="wording"> � <code class="highlight"><c- n>simd</c-></code> complex accessors        [simd.complex_accessors]</span></b> 
<pre class="highlight"><c- k>constexpr</c-> <c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>-</c-><c- n>element</c-><c- o>-</c-><c- n>type</c-><c- p>,</c-> <c- n>size</c-><c- o>></c-> <c- n>real</c-><c- p>()</c-> <c- k>const</c-><c- p>;</c->
<c- k>constexpr</c-> <c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>-</c-><c- n>element</c-><c- o>-</c-><c- n>type</c-><c- p>,</c-> <c- n>size</c-><c- o>></c-> <c- n>imag</c-><c- p>()</c-> <c- k>const</c-><c- p>;</c-></pre>
     <p>Constraints:</p>
     <ul>
      <li data-md>
       <p><code class="highlight"><c- n>T</c-></code> is a complex value (i.e., any valid instantiation of <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-><c- o>&lt;></c-></code> template).</p>
     </ul>
     <p>Returns:</p>
     <ul>
      <li data-md>
       <p>A simd with values of complex-element-type that is a value_type of <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-></code> of the same width. The i<sup>th</sup> element will be equal to <code class="highlight"><c- p>(</c-><c- o>*</c-><c- k>this</c-><c- p>)[</c-><c- n>i</c-><c- p>].</c-><c- n>real</c-><c- p>()</c-></code> or <code class="highlight"><c- p>(</c-><c- o>*</c-><c- k>this</c-><c- p>)[</c-><c- n>i</c-><c- p>].</c-><c- n>imag</c-><c- p>()</c-></code> respectively for all i in
the range <code class="highlight"><c- p>[</c-><c- mf>0.</c-><c- p>.</c-><c- n>size</c-><c- p>)</c-></code>.</p>
     </ul>
<pre class="highlight"><c- k>template</c-><c- o>&lt;</c-><c- k>typename</c-> <c- nc>CAbi</c-><c- o>></c->
<c- k>constexpr</c-> <c- b>void</c-> <c- n>real</c-><c- p>(</c-><c- k>const</c-> <c- n>basic_simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>-</c-><c- n>element</c-><c- o>-</c-><c- n>type</c-><c- p>,</c-> <c- n>CAbi</c-><c- o>>&amp;</c-> <c- n>v</c-><c- p>)</c-> <c- k>noexcept</c-><c- p>;</c->
<c- k>template</c-><c- o>&lt;</c-><c- k>typename</c-> <c- nc>CAbi</c-><c- o>></c->
<c- k>constexpr</c-> <c- b>void</c-> <c- n>imag</c-><c- p>(</c-><c- k>const</c-> <c- n>basic_simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>-</c-><c- n>element</c-><c- o>-</c-><c- n>type</c-><c- p>,</c-> <c- n>CAbi</c-><c- o>>&amp;</c-> <c- n>v</c-><c- p>)</c-> <c- k>noexcept</c-><c- p>;</c-></pre>
     <p>Constraints:</p>
     <ul>
      <li data-md>
       <p><code class="highlight"><c- n>T</c-></code> is a complex value (i.e., any valid instantiation of <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-><c- o>&lt;></c-></code> template).</p>
      <li data-md>
       <p><code class="highlight"><c- n>complex</c-><c- o>-</c-><c- n>element</c-><c- o>-</c-><c- n>type</c-></code> is the same as the simd <code class="highlight"><c- n>value</c-><c- o>-</c-><c- n>type</c-></code>.</p>
      <li data-md>
       <p><code class="highlight"><c- n>basic_simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>-</c-><c- n>element</c-><c- o>-</c-><c- n>type</c-><c- p>,</c-> <c- n>CAbi</c-><c- o>>::</c-><c- n>size</c-></code> is equal to <code class="highlight"><c- n>basic_simd</c-><c- o>::</c-><c- n>size</c-></code>.</p>
     </ul>
     <p>Effect:</p>
     <ul>
      <li data-md>
       <p>Modify each element of the simd such that the real or imaginary component of
the i<sup>th</sup> element is replaced by the value of <code class="highlight"><c- n>v</c-><c- p>[</c-><c- n>i</c-><c- p>].</c-><c- n>real</c-></code> or <code class="highlight"><c- n>v</c-><c- p>[</c-><c- n>i</c-><c- p>].</c-><c- n>imag</c-><c- p>()</c-></code> respectively.</p>
     </ul>
<pre class="highlight"><c- k>template</c-><c- o>&lt;</c-><c- k>typename</c-> <c- nc>T</c-><c- p>,</c-> <c- k>typename</c-> <c- nc>Abi</c-><c- o>></c->
<c- k>constexpr</c-> <c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>-</c-><c- n>element</c-><c- o>-</c-><c- n>type</c-><c- p>,</c-> <c- n>size</c-><c- o>></c->
<c- n>real</c-><c- p>(</c-><c- k>const</c-> <c- n>basic_simd</c-><c- o>&lt;</c-><c- k>typename</c-> <c- nc>T</c-><c- p>,</c-> <c- k>typename</c-> <c- nc>Abi</c-><c- o>>&amp;</c-> <c- n>v</c-><c- p>)</c-> <c- k>noexcept</c-><c- p>;</c->

<c- k>template</c-><c- o>&lt;</c-><c- k>typename</c-> <c- nc>T</c-><c- p>,</c-> <c- k>typename</c-> <c- nc>Abi</c-><c- o>></c->
<c- k>constexpr</c-> <c- n>simd</c-><c- o>&lt;</c-><c- n>complex</c-><c- o>-</c-><c- n>element</c-><c- o>-</c-><c- n>type</c-><c- p>,</c-> <c- n>size</c-><c- o>></c->
<c- n>imag</c-><c- p>(</c-><c- k>const</c-> <c- n>basic_simd</c-><c- o>&lt;</c-><c- k>typename</c-> <c- nc>T</c-><c- p>,</c-> <c- k>typename</c-> <c- nc>Abi</c-><c- o>>&amp;</c-> <c- n>v</c-><c- p>)</c-> <c- k>noexcept</c-><c- p>;</c-></pre>
     <p>Constraints:</p>
     <ul>
      <li data-md>
       <p><code class="highlight"><c- n>T</c-></code> is a complex value (i.e., any valid instantiation of <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-><c- o>&lt;></c-></code> template).</p>
     </ul>
     <p>Returns:</p>
     <ul>
      <li data-md>
       <p>A simd with values of complex-element-type that is a value_type of <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-></code> of the same width, where the i<sup>th</sup> element is equal
to <code class="highlight"><c- n>v</c-><c- p>[</c-><c- n>i</c-><c- p>].</c-><c- n>real</c-><c- p>()</c-></code> or <code class="highlight"><c- n>v</c-><c- p>[</c-><c- n>i</c-><c- p>].</c-><c- n>imag</c-><c- p>()</c-></code> respectively for all i in the
range <code class="highlight"><c- p>[</c-><c- mf>0.</c-><c- p>.</c-><c- n>v</c-><c- p>.</c-><c- n>size</c-><c- p>)</c-></code>.</p>
     </ul>
    </blockquote>
   </ins>
   <h3 class="heading settled" data-level="5.5" id="wording_complex_library"><span class="secno">5.5. </span><span class="content">Add new section [<strong>simd.complex_math</strong>]</span><a class="self-link" href="#wording_complex_library"></a></h3>
   <ins>
    <blockquote>
      <b><span>� <code class="highlight"><c- n>simd</c-></code> complex maths library        [simd.complex_library]</span></b> 
     <p>For each set of overloaded functions within <code class="highlight"><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-></code> there
shall be additional overloads sufficient to ensure that:</p>
     <ul>
      <li data-md>
       <p>Any <code class="highlight"><c- n>basic_simd</c-><c- o>&lt;</c-><c- n>std</c-><c- o>::</c-><c- n>complex</c-><c- o>&lt;</c-><c- n>T</c-><c- o>></c-><c- p>,</c-> <c- n>Abi</c-><c- o>></c-></code> type can be used where <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>complex</c-><c- o>&lt;></c-></code> would be used (parameter or return value).</p>
      <li data-md>
       <p>Any real-valued <code class="highlight"><c- n>simd</c-><c- o>&lt;</c-><c- n>T</c-><c- p>,</c-> <c- n>Abi</c-><c- o>></c-></code> type can be used where T would be used (parameter or return value).</p>
     </ul>
     <p>It is unspecified whether a call to these overloads with arguments that are all convertible to <code class="highlight"><c- n>basic_simd</c-><c- o>&lt;</c-><c- n>T</c-><c- p>,</c-> <c- n>Abi</c-><c- o>></c-></code> but are
not of type <code class="highlight"><c- n>basic_simd</c-><c- o>&lt;</c-><c- n>T</c-><c- p>,</c-> <c- n>Abi</c-><c- o>></c-></code> is well-formed.</p>
     <p>Each function overload produced by the above rules applies the indicated <code class="highlight"><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-></code> function element-wise. For the mathematical
functions, the results per element only need to be approximately equal to the
application of the function which is overloaded for the element type.</p>
     <p>The result is unspecified if a domain, pole, or range error occurs when the input argument(s) are applied to
the indicated <code class="highlight"><c- o>&lt;</c-><c- n>complex</c-><c- o>></c-></code> function. [ Note: Implementations are encouraged to follow the C specification (especially
Annex F). — end note ]</p>
    </blockquote>
   </ins>
   <h2 class="heading settled" data-level="6" id="polls"><span class="secno">6. </span><span class="content">Polls</span><a class="self-link" href="#polls"></a></h2>
   <h3 class="heading settled" data-level="6.1" id="kona_2022_sg1_polls"><span class="secno">6.1. </span><span class="content">Kona 2022 SG1 polls</span><a class="self-link" href="#kona_2022_sg1_polls"></a></h3>
   <p><strong>Poll</strong>: After significant experience with the TS, we recommend that the next version (the TS version with
improvements) of <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> target the IS (C++26)</p>
   <table>
    <tbody>
     <tr>
      <th>SF
      <th>F
      <th>N
      <th>A
      <th>SA
     <tr>
      <th>10
      <th>8
      <th>0
      <th>0
      <th>0
   </table>
   <p><strong>Poll</strong>: Future papers and future revisions of existing papers that target <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> should go directly to LEWG. (We do not believe
there are SG1 issues with <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> today.)</p>
   <table>
    <tbody>
     <tr>
      <th>SF
      <th>F
      <th>N
      <th>A
      <th>SA
     <tr>
      <th>9
      <th>8
      <th>0
      <th>0
      <th>0
   </table>
   <h2 class="heading settled" data-level="7" id="revision_history"><span class="secno">7. </span><span class="content">Revision History</span><a class="self-link" href="#revision_history"></a></h2>
   <p>R3 => R4</p>
   <ul>
    <li data-md>
     <p>Updated wording to reflect changes made to <code class="highlight"><c- n>std</c-><c- o>::</c-><c- n>simd</c-></code> in <a data-link-type="biblio" href="#biblio-p1928r6" title="std::simd - Merge data-parallel types from the Parallelism TS 2">[P1928R6]</a> (e.g., removal of <code class="highlight"><c- n>fixed_size_simd</c-></code>, addition of <code class="highlight"><c- n>basic_simd</c-></code>).</p>
   </ul>
   <p>R2 => R3</p>
   <ul>
    <li data-md>
     <p>Added wording</p>
   </ul>
   <p>R1 => R2</p>
   <ul>
    <li data-md>
     <p>Add more content for proposal overview</p>
    <li data-md>
     <p>Rewrite to bikeshed</p>
   </ul>
   <p>R0 => R1</p>
   <ul>
    <li data-md>
     <p>Add polls from Kona SG1 2022</p>
   </ul>
  </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-p1928r6">[P1928R6]
   <dd>Matthias Kretz. <a href="https://wg21.link/p1928r6"><cite>std::simd - Merge data-parallel types from the Parallelism TS 2</cite></a>. 19 June 2023. URL: <a href="https://wg21.link/p1928r6">https://wg21.link/p1928r6</a>
   <dt id="biblio-p2638r0">[P2638R0]
   <dd>Daniel Towner. <a href="https://wg21.link/p2638r0"><cite>Intel's response to P1915R0 for std::simd parallelism in TS 2</cite></a>. 22 September 2022. URL: <a href="https://wg21.link/p2638r0">https://wg21.link/p2638r0</a>
  </dl>