<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang xml:lang>
<head>
  <meta charset="utf-8" />
  <meta name="generator" content="mpark/wg21" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
  <meta name="dcterms.date" content="2024-02-05" />
  <title>Policy for `explicit`</title>
  <style>
      code{white-space: pre-wrap;}
      span.smallcaps{font-variant: small-caps;}
      span.underline{text-decoration: underline;}
      div.column{display: inline-block; vertical-align: top; width: 50%;}
      div.csl-block{margin-left: 1.5em;}
      ul.task-list{list-style: none;}
      pre > code.sourceCode { white-space: pre; position: relative; }
      pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
      pre > code.sourceCode > span:empty { height: 1.2em; }
      .sourceCode { overflow: visible; }
      code.sourceCode > span { color: inherit; text-decoration: inherit; }
      div.sourceCode { margin: 1em 0; }
      pre.sourceCode { margin: 0; }
      @media screen {
      div.sourceCode { overflow: auto; }
      }
      @media print {
      pre > code.sourceCode { white-space: pre-wrap; }
      pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
      }
      pre.numberSource code
        { counter-reset: source-line 0; }
      pre.numberSource code > span
        { position: relative; left: -4em; counter-increment: source-line; }
      pre.numberSource code > span > a:first-child::before
        { content: counter(source-line);
          position: relative; left: -1em; text-align: right; vertical-align: baseline;
          border: none; display: inline-block;
          -webkit-touch-callout: none; -webkit-user-select: none;
          -khtml-user-select: none; -moz-user-select: none;
          -ms-user-select: none; user-select: none;
          padding: 0 4px; width: 4em;
          color: #aaaaaa;
        }
      pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
      div.sourceCode
        {  background-color: #f6f8fa; }
      @media screen {
      pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
      }
      code span { } /* Normal */
      code span.al { color: #ff0000; } /* Alert */
      code span.an { } /* Annotation */
      code span.at { } /* Attribute */
      code span.bn { color: #9f6807; } /* BaseN */
      code span.bu { color: #9f6807; } /* BuiltIn */
      code span.cf { color: #00607c; } /* ControlFlow */
      code span.ch { color: #9f6807; } /* Char */
      code span.cn { } /* Constant */
      code span.co { color: #008000; font-style: italic; } /* Comment */
      code span.cv { color: #008000; font-style: italic; } /* CommentVar */
      code span.do { color: #008000; } /* Documentation */
      code span.dt { color: #00607c; } /* DataType */
      code span.dv { color: #9f6807; } /* DecVal */
      code span.er { color: #ff0000; font-weight: bold; } /* Error */
      code span.ex { } /* Extension */
      code span.fl { color: #9f6807; } /* Float */
      code span.fu { } /* Function */
      code span.im { } /* Import */
      code span.in { color: #008000; } /* Information */
      code span.kw { color: #00607c; } /* Keyword */
      code span.op { color: #af1915; } /* Operator */
      code span.ot { } /* Other */
      code span.pp { color: #6f4e37; } /* Preprocessor */
      code span.re { } /* RegionMarker */
      code span.sc { color: #9f6807; } /* SpecialChar */
      code span.ss { color: #9f6807; } /* SpecialString */
      code span.st { color: #9f6807; } /* String */
      code span.va { } /* Variable */
      code span.vs { color: #9f6807; } /* VerbatimString */
      code span.wa { color: #008000; font-weight: bold; } /* Warning */
      code.diff {color: #898887}
      code.diff span.va {color: #006e28}
      code.diff span.st {color: #bf0303}
  </style>
  <style type="text/css">
body {
margin: 5em;
font-family: serif;

hyphens: auto;
line-height: 1.35;
text-align: justify;
}
@media screen and (max-width: 30em) {
body {
margin: 1.5em;
}
}
div.wrapper {
max-width: 60em;
margin: auto;
}
ul {
list-style-type: none;
padding-left: 2em;
margin-top: -0.2em;
margin-bottom: -0.2em;
}
a {
text-decoration: none;
color: #4183C4;
}
a.hidden_link {
text-decoration: none;
color: inherit;
}
li {
margin-top: 0.6em;
margin-bottom: 0.6em;
}
h1, h2, h3, h4 {
position: relative;
line-height: 1;
}
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;
font-family: sans-serif;
font-weight: normal;
font-size: 83%;
}
a.self-link:hover { opacity: 1; }
a.self-link::before { content: "§"; }
ul > li:before {
content: "\2014";
position: absolute;
margin-left: -1.5em;
}
:target { background-color: #C9FBC9; }
:target .codeblock { background-color: #C9FBC9; }
:target ul { background-color: #C9FBC9; }
.abbr_ref { float: right; }
.folded_abbr_ref { float: right; }
:target .folded_abbr_ref { display: none; }
:target .unfolded_abbr_ref { float: right; display: inherit; }
.unfolded_abbr_ref { display: none; }
.secnum { display: inline-block; min-width: 35pt; }
.header-section-number { display: inline-block; min-width: 35pt; }
.annexnum { display: block; }
div.sourceLinkParent {
float: right;
}
a.sourceLink {
position: absolute;
opacity: 0;
margin-left: 10pt;
}
a.sourceLink:hover {
opacity: 1;
}
a.itemDeclLink {
position: absolute;
font-size: 75%;
text-align: right;
width: 5em;
opacity: 0;
}
a.itemDeclLink:hover { opacity: 1; }
span.marginalizedparent {
position: relative;
left: -5em;
}
li span.marginalizedparent { left: -7em; }
li ul > li span.marginalizedparent { left: -9em; }
li ul > li ul > li span.marginalizedparent { left: -11em; }
li ul > li ul > li ul > li span.marginalizedparent { left: -13em; }
div.footnoteNumberParent {
position: relative;
left: -4.7em;
}
a.marginalized {
position: absolute;
font-size: 75%;
text-align: right;
width: 5em;
}
a.enumerated_item_num {
position: relative;
left: -3.5em;
display: inline-block;
margin-right: -3em;
text-align: right;
width: 3em;
}
div.para { margin-bottom: 0.6em; margin-top: 0.6em; text-align: justify; }
div.section { text-align: justify; }
div.sentence { display: inline; }
span.indexparent {
display: inline;
position: relative;
float: right;
right: -1em;
}
a.index {
position: absolute;
display: none;
}
a.index:before { content: "⟵"; }

a.index:target {
display: inline;
}
.indexitems {
margin-left: 2em;
text-indent: -2em;
}
div.itemdescr {
margin-left: 3em;
}
.bnf {
font-family: serif;
margin-left: 40pt;
margin-top: 0.5em;
margin-bottom: 0.5em;
}
.ncbnf {
font-family: serif;
margin-top: 0.5em;
margin-bottom: 0.5em;
margin-left: 40pt;
}
.ncsimplebnf {
font-family: serif;
font-style: italic;
margin-top: 0.5em;
margin-bottom: 0.5em;
margin-left: 40pt;
background: inherit; 
}
span.textnormal {
font-style: normal;
font-family: serif;
white-space: normal;
display: inline-block;
}
span.rlap {
display: inline-block;
width: 0px;
}
span.descr { font-style: normal; font-family: serif; }
span.grammarterm { font-style: italic; }
span.term { font-style: italic; }
span.terminal { font-family: monospace; font-style: normal; }
span.nonterminal { font-style: italic; }
span.tcode { font-family: monospace; font-style: normal; }
span.textbf { font-weight: bold; }
span.textsc { font-variant: small-caps; }
a.nontermdef { font-style: italic; font-family: serif; }
span.emph { font-style: italic; }
span.techterm { font-style: italic; }
span.mathit { font-style: italic; }
span.mathsf { font-family: sans-serif; }
span.mathrm { font-family: serif; font-style: normal; }
span.textrm { font-family: serif; }
span.textsl { font-style: italic; }
span.mathtt { font-family: monospace; font-style: normal; }
span.mbox { font-family: serif; font-style: normal; }
span.ungap { display: inline-block; width: 2pt; }
span.textit { font-style: italic; }
span.texttt { font-family: monospace; }
span.tcode_in_codeblock { font-family: monospace; font-style: normal; }
span.phantom { color: white; }

span.math { font-style: normal; }
span.mathblock {
display: block;
margin-left: auto;
margin-right: auto;
margin-top: 1.2em;
margin-bottom: 1.2em;
text-align: center;
}
span.mathalpha {
font-style: italic;
}
span.synopsis {
font-weight: bold;
margin-top: 0.5em;
display: block;
}
span.definition {
font-weight: bold;
display: block;
}
.codeblock {
margin-left: 1.2em;
line-height: 127%;
}
.outputblock {
margin-left: 1.2em;
line-height: 127%;
}
div.itemdecl {
margin-top: 2ex;
}
code.itemdeclcode {
white-space: pre;
display: block;
}
span.textsuperscript {
vertical-align: super;
font-size: smaller;
line-height: 0;
}
.footnotenum { vertical-align: super; font-size: smaller; line-height: 0; }
.footnote {
font-size: small;
margin-left: 2em;
margin-right: 2em;
margin-top: 0.6em;
margin-bottom: 0.6em;
}
div.minipage {
display: inline-block;
margin-right: 3em;
}
div.numberedTable {
text-align: center;
margin: 2em;
}
div.figure {
text-align: center;
margin: 2em;
}
table {
border: 1px solid black;
border-collapse: collapse;
margin-left: auto;
margin-right: auto;
margin-top: 0.8em;
text-align: left;
hyphens: none; 
}
td, th {
padding-left: 1em;
padding-right: 1em;
vertical-align: top;
}
td.empty {
padding: 0px;
padding-left: 1px;
}
td.left {
text-align: left;
}
td.right {
text-align: right;
}
td.center {
text-align: center;
}
td.justify {
text-align: justify;
}
td.border {
border-left: 1px solid black;
}
tr.rowsep, td.cline {
border-top: 1px solid black;
}
tr.even, tr.odd {
border-bottom: 1px solid black;
}
tr.capsep {
border-top: 3px solid black;
border-top-style: double;
}
tr.header {
border-bottom: 3px solid black;
border-bottom-style: double;
}
th {
border-bottom: 1px solid black;
}
span.centry {
font-weight: bold;
}
div.table {
display: block;
margin-left: auto;
margin-right: auto;
text-align: center;
width: 90%;
}
span.indented {
display: block;
margin-left: 2em;
margin-bottom: 1em;
margin-top: 1em;
}
ol.enumeratea { list-style-type: none; background: inherit; }
ol.enumerate { list-style-type: none; background: inherit; }

code.sourceCode > span { display: inline; }
</style>
  <link href="data:image/x-icon;base64,AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AIJEAACCRAAAgkQAAIJEAACCRAAAgkQAVoJEAN6CRADegkQAWIJEAACCRAAAgkQAAIJEAACCRAAA////AP///wCCRAAAgkQAAIJEAACCRAAsgkQAvoJEAP+CRAD/gkQA/4JEAP+CRADAgkQALoJEAACCRAAAgkQAAP///wD///8AgkQAAIJEABSCRACSgkQA/IJEAP99PQD/dzMA/3czAP99PQD/gkQA/4JEAPyCRACUgkQAFIJEAAD///8A////AHw+AFiBQwDqgkQA/4BBAP9/PxP/uZd6/9rJtf/bybX/upd7/39AFP+AQQD/gkQA/4FDAOqAQgBc////AP///wDKklv4jlEa/3o7AP+PWC//8+3o///////////////////////z7un/kFox/35AAP+GRwD/mVYA+v///wD///8A0Zpk+NmibP+0d0T/8evj///////+/fv/1sKz/9bCs//9/fr//////+/m2/+NRwL/nloA/5xYAPj///8A////ANKaZPjRmGH/5cKh////////////k149/3UwAP91MQD/lmQ//86rhv+USg3/m1YA/5hSAP+bVgD4////AP///wDSmmT4zpJY/+/bx///////8+TV/8mLT/+TVx//gkIA/5lVAP+VTAD/x6B//7aEVv/JpH7/s39J+P///wD///8A0ppk+M6SWP/u2sf///////Pj1f/Nj1T/2KFs/8mOUv+eWhD/lEsA/8aee/+0glT/x6F7/7J8Rvj///8A////ANKaZPjRmGH/48Cf///////+/v7/2qt//82PVP/OkFX/37KJ/86siv+USg7/mVQA/5hRAP+bVgD4////AP///wDSmmT40ppk/9CVXP/69O////////7+/v/x4M//8d/P//7+/f//////9u7n/6tnJf+XUgD/nFgA+P///wD///8A0ppk+NKaZP/RmWL/1qNy//r07///////////////////////+vXw/9akdP/Wnmn/y5FY/6JfFvj///8A////ANKaZFTSmmTo0ppk/9GYYv/Ql1//5cWm//Hg0P/x4ND/5cWm/9GXYP/RmGH/0ppk/9KaZOjVnmpY////AP///wDSmmQA0ppkEtKaZI7SmmT60ppk/9CWX//OkVb/zpFW/9CWX//SmmT/0ppk/NKaZJDSmmQS0ppkAP///wD///8A0ppkANKaZADSmmQA0ppkKtKaZLrSmmT/0ppk/9KaZP/SmmT/0ppkvNKaZCrSmmQA0ppkANKaZAD///8A////ANKaZADSmmQA0ppkANKaZADSmmQA0ppkUtKaZNzSmmTc0ppkVNKaZADSmmQA0ppkANKaZADSmmQA////AP5/AAD4HwAA4AcAAMADAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAMADAADgBwAA+B8AAP5/AAAoAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wCCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAAyCRACMgkQA6oJEAOqCRACQgkQAEIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAA////AP///wD///8A////AIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRABigkQA5oJEAP+CRAD/gkQA/4JEAP+CRADqgkQAZoJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAAD///8A////AP///wD///8AgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAA4gkQAwoJEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQAxIJEADyCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAP///wD///8A////AP///wCCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAWgkQAmIJEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAJyCRAAYgkQAAIJEAACCRAAAgkQAAIJEAACCRAAA////AP///wD///8A////AIJEAACCRAAAgkQAAIJEAACCRAAAgkQAdIJEAPCCRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAPSCRAB4gkQAAIJEAACCRAAAgkQAAIJEAAD///8A////AP///wD///8AgkQAAIJEAACCRAAAgkQASoJEANKCRAD/gkQA/4JEAP+CRAD/g0YA/39AAP9zLgD/bSQA/2shAP9rIQD/bSQA/3MuAP9/PwD/g0YA/4JEAP+CRAD/gkQA/4JEAP+CRADUgkQAToJEAACCRAAAgkQAAP///wD///8A////AP///wB+PwAAgkUAIoJEAKiCRAD/gkQA/4JEAP+CRAD/hEcA/4BBAP9sIwD/dTAA/5RfKv+viF7/vp56/76ee/+wiF7/lWAr/3YxAP9sIwD/f0AA/4RHAP+CRAD/gkQA/4JEAP+CRAD/gkQArIJEACaBQwAA////AP///wD///8A////AIBCAEBzNAD6f0EA/4NFAP+CRAD/gkQA/4VIAP92MwD/bSUA/6N1Tv/ezsL/////////////////////////////////38/D/6V3Uv9uJgD/dTEA/4VJAP+CRAD/gkQA/4JEAP+BQwD/fUAA/4FDAEj///8A////AP///wD///8AzJRd5qBlKf91NgD/dDUA/4JEAP+FSQD/cy4A/3YyAP/PuKP//////////////////////////////////////////////////////9K7qP94NQD/ciwA/4VJAP+CRAD/fkEA/35BAP+LSwD/mlYA6v///wD///8A////AP///wDdpnL/4qx3/8KJUv+PUhf/cTMA/3AsAP90LgD/4dK+/////////////////////////////////////////////////////////////////+TYxf91MAD/dTIA/31CAP+GRwD/llQA/6FcAP+gWwD8////AP///wD///8A////ANGZY/LSm2X/4ap3/92mcP+wdT3/byQA/8mwj////////////////////////////////////////////////////////////////////////////+LYxv9zLgP/jUoA/59bAP+hXAD/nFgA/5xYAPL///8A////AP///wD///8A0ppk8tKaZP/RmWL/1p9q/9ubXv/XqXj////////////////////////////7+fD/vZyG/6BxS/+gcUr/vJuE//r37f//////////////////////3MOr/5dQBf+dVQD/nVkA/5xYAP+cWAD/nFgA8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/SmWP/yohJ//jo2P//////////////////////4NTG/4JDFf9lGAD/bSQA/20kAP9kGAD/fz8S/+Xb0f//////5NG9/6txN/+LOgD/m1QA/51aAP+cWAD/m1cA/5xYAP+cWADy////AP///wD///8A////ANKaZPLSmmT/0ppk/8+TWf/Unmv//v37//////////////////////+TWRr/VwsA/35AAP+ERgD/g0UA/4JGAP9lHgD/kFga/8KXX/+TRwD/jT4A/49CAP+VTQD/n10A/5xYAP+OQQD/lk4A/55cAPL///8A////AP///wD///8A0ppk8tKaZP/SmmT/y4tO/92yiP//////////////////////8NnE/8eCQP+rcTT/ez0A/3IyAP98PgD/gEMA/5FSAP+USwD/jj8A/5lUAP+JNwD/yqV2/694Mf+HNQD/jkAA/82rf/+laBj/jT4A8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/LiUr/4byY///////////////////////gupX/0I5P/+Wuev/Lklz/l1sj/308AP+QSwD/ol0A/59aAP+aVQD/k0oA/8yoh///////+fXv/6pwO//Lp3v///////Pr4f+oay7y////AP///wD///8A////ANKaZPLSmmT/0ppk/8uJSv/hvJj//////////////////////+G7l//Jhkb/0ppk/96nc//fqXX/x4xO/6dkFP+QSQD/llEA/5xXAP+USgD/yaOA///////38uv/qG05/8ijdv//////8efb/6ZpLPL///8A////AP///wD///8A0ppk8tKaZP/SmmT/zIxO/9yxh///////////////////////7dbA/8iEQf/Sm2X/0Zlj/9ScZv/eqHf/2KJv/7yAQf+XTgD/iToA/5lSAP+JNgD/yKFv/611LP+HNQD/jT8A/8qmeP+kZRT/jT4A8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/Pk1n/1J5q//78+//////////////////+/fv/1aFv/8iEQv/Tm2b/0ppl/9GZY//Wn2z/1pZc/9eldf/Bl2b/kUcA/4w9AP+OQAD/lUwA/59eAP+cWQD/jT8A/5ZOAP+eXADy////AP///wD///8A////ANKaZPLSmmT/0ppk/9KZY//KiEn/8d/P///////////////////////47+f/05tm/8iCP//KiEj/yohJ/8eCP//RmGH//vfy///////n1sP/rXQ7/4k4AP+TTAD/nVoA/5xYAP+cVwD/nFgA/5xYAPL///8A////AP///wD///8A0ppk8tKaZP/SmmT/0ptl/8uLTf/aq37////////////////////////////+/fz/6c2y/961jv/etY7/6Myx//78+v//////////////////////3MWv/5xXD/+ORAD/mFQA/51ZAP+cWAD/nFgA8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/SmmT/0ppk/8mFRP/s1b//////////////////////////////////////////////////////////////////////////////+PD/0JFU/7NzMv+WUQD/kUsA/5tXAP+dWQDy////AP///wD///8A////ANKaZP/SmmT/0ppk/9KaZP/Sm2X/z5NZ/8yMT//z5NX/////////////////////////////////////////////////////////////////9Ofa/8yNUP/UmGH/36p5/8yTWv+qaSD/kksA/5ROAPz///8A////AP///wD///8A0ppk5NKaZP/SmmT/0ppk/9KaZP/TnGf/zY9T/82OUv/t1sD//////////////////////////////////////////////////////+7Yw//OkFX/zI5R/9OcZ//SmmP/26V0/9ymdf/BhUf/ol8R6P///wD///8A////AP///wDSmmQ80ppk9tKaZP/SmmT/0ppk/9KaZP/TnGj/zpFW/8qJSv/dson/8uHS//////////////////////////////////Lj0//etIv/y4lL/86QVf/TnGj/0ppk/9KaZP/RmWP/05xn/9ymdfjUnWdC////AP///wD///8A////ANKaZADSmmQc0ppkotKaZP/SmmT/0ppk/9KaZP/Tm2b/0Zli/8qJSf/NjlH/16Z3/+G8mP/myKr/5siq/+G8mP/Xp3f/zY5S/8qISf/RmGH/05tm/9KaZP/SmmT/0ppk/9KaZP/SmmSm0pljINWdaQD///8A////AP///wD///8A0ppkANKaZADSmmQA0ppkQtKaZMrSmmT/0ppk/9KaZP/SmmT/0ptl/9GYYf/Nj1P/y4lL/8qISP/KiEj/y4lK/82PU//RmGH/0ptl/9KaZP/SmmT/0ppk/9KaZP/SmmTO0ppkRtKaZADSmmQA0ppkAP///wD///8A////AP///wDSmmQA0ppkANKaZADSmmQA0ppkANKaZGzSmmTu0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmTw0ppkcNKaZADSmmQA0ppkANKaZADSmmQA////AP///wD///8A////ANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZBLSmmSQ0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppklNKaZBTSmmQA0ppkANKaZADSmmQA0ppkANKaZAD///8A////AP///wD///8A0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQy0ppkutKaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppkvtKaZDbSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkAP///wD///8A////AP///wDSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkXNKaZODSmmT/0ppk/9KaZP/SmmT/0ppk5NKaZGDSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA////AP///wD///8A////ANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkBtKaZIbSmmTo0ppk6tKaZIrSmmQK0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZAD///8A////AP/8P///+B///+AH//+AAf//AAD//AAAP/AAAA/gAAAHwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA+AAAAfwAAAP/AAAP/8AAP//gAH//+AH///4H////D//" rel="icon" />
  
  <!--[if lt IE 9]>
    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
  <![endif]-->
</head>
<body>
<div class="wrapper">
<header id="title-block-header">
<h1 class="title" style="text-align:center">Policy for
<code class="sourceCode default">explicit</code></h1>
<table style="border:none;float:right">
  <tr>
    <td>Document #:</td>
    <td>P3116R0</td>
  </tr>
  <tr>
    <td>Date:</td>
    <td>2024-02-05</td>
  </tr>
  <tr>
    <td style="vertical-align:top">Project:</td>
    <td>Programming Language C++</td>
  </tr>
  <tr>
    <td style="vertical-align:top">Audience:</td>
    <td>
      LEWG<br>
      LWG<br>
    </td>
  </tr>
  <tr>
    <td style="vertical-align:top">Reply-to:</td>
    <td>
      Zach Laine<br>&lt;<a href="mailto:whatwasthataddress@gmail.com" class="email">whatwasthataddress@gmail.com</a>&gt;<br>
    </td>
  </tr>
</table>
</header>
<div style="clear:both">
<div id="TOC" role="doc-toc">
<h1 id="toctitle">Contents</h1>
<ul>
<li><a href="#changelog" id="toc-changelog"><span class="toc-section-number">1</span> Changelog<span></span></a></li>
<li><a href="#motivation" id="toc-motivation"><span class="toc-section-number">2</span> Motivation<span></span></a></li>
<li><a href="#requirements-for-this-policy" id="toc-requirements-for-this-policy"><span class="toc-section-number">3</span> Requirements for this
policy<span></span></a>
<ul>
<li><a href="#a-rationale-and-5-a-rationale-as-to-why-adopting-the-policy-will-improve-coherence-and-or-save-time." id="toc-a-rationale-and-5-a-rationale-as-to-why-adopting-the-policy-will-improve-coherence-and-or-save-time."><span class="toc-section-number">3.1</span> (1) A rationale, and (5) A
rationale as to why adopting the policy will improve coherence and / or
save time.<span></span></a></li>
<li><a href="#a-survey-of-the-prior-art-of-the-topic-as-appears-in-the-standard." id="toc-a-survey-of-the-prior-art-of-the-topic-as-appears-in-the-standard."><span class="toc-section-number">3.2</span> (2) A survey of the prior art of
the topic, as appears in the standard.<span></span></a>
<ul>
<li><a href="#support-9-occurrences" id="toc-support-9-occurrences"><span class="toc-section-number">3.2.1</span>
<code class="sourceCode default">[support]</code> (9
occurrences)<span></span></a></li>
<li><a href="#diagnostics-26-occurrences" id="toc-diagnostics-26-occurrences"><span class="toc-section-number">3.2.2</span>
<code class="sourceCode default">[diagnostics]</code> (26
occurrences)<span></span></a></li>
<li><a href="#mem-25-occurrences" id="toc-mem-25-occurrences"><span class="toc-section-number">3.2.3</span>
<code class="sourceCode default">[mem]</code> (25
occurrences)<span></span></a></li>
<li><a href="#utilities-83-occurrences" id="toc-utilities-83-occurrences"><span class="toc-section-number">3.2.4</span>
<code class="sourceCode default">[utilities]</code> (83
occurrences)<span></span></a></li>
<li><a href="#strings-8-occurrences" id="toc-strings-8-occurrences"><span class="toc-section-number">3.2.5</span>
<code class="sourceCode default">[strings]</code> (8
occurrences)<span></span></a></li>
<li><a href="#containers-87-occurrences" id="toc-containers-87-occurrences"><span class="toc-section-number">3.2.6</span>
<code class="sourceCode default">[containers]</code> (87
occurrences)<span></span></a></li>
<li><a href="#iterators-10-occurrences" id="toc-iterators-10-occurrences"><span class="toc-section-number">3.2.7</span>
<code class="sourceCode default">[iterators]</code> (10
occurrences)<span></span></a></li>
<li><a href="#ranges-138-occurrences" id="toc-ranges-138-occurrences"><span class="toc-section-number">3.2.8</span>
<code class="sourceCode default">[ranges]</code> (138
occurrences)<span></span></a></li>
<li><a href="#numerics-90-occurrences" id="toc-numerics-90-occurrences"><span class="toc-section-number">3.2.9</span>
<code class="sourceCode default">[numerics]</code> (90
occurrences)<span></span></a></li>
<li><a href="#time-47-occurrences" id="toc-time-47-occurrences"><span class="toc-section-number">3.2.10</span>
<code class="sourceCode default">[time]</code> (47
occurrences)<span></span></a></li>
<li><a href="#localization-38-occurrences" id="toc-localization-38-occurrences"><span class="toc-section-number">3.2.11</span>
<code class="sourceCode default">[localization]</code> (38
occurrences)<span></span></a></li>
<li><a href="#input.output-110-occurrences" id="toc-input.output-110-occurrences"><span class="toc-section-number">3.2.12</span>
<code class="sourceCode default">[input.output]</code> (110
occurrences)<span></span></a></li>
<li><a href="#re-7-occurrences" id="toc-re-7-occurrences"><span class="toc-section-number">3.2.13</span>
<code class="sourceCode default">[re]</code> (7
occurrences)<span></span></a></li>
<li><a href="#thread-43-occurrences" id="toc-thread-43-occurrences"><span class="toc-section-number">3.2.14</span>
<code class="sourceCode default">[thread]</code> (43
occurrences)<span></span></a></li>
</ul></li>
<li><a href="#a-survey-of-the-status-quo-for-this-topic-in-the-wider-c-community." id="toc-a-survey-of-the-status-quo-for-this-topic-in-the-wider-c-community."><span class="toc-section-number">3.3</span> (3) A survey of the status quo for
this topic, in the wider C++ community.<span></span></a></li>
</ul></li>
<li><a href="#proposal" id="toc-proposal"><span class="toc-section-number">4</span> Proposal<span></span></a>
<ul>
<li><a href="#a-clear-and-concise-definition-of-the-policy-proposed." id="toc-a-clear-and-concise-definition-of-the-policy-proposed."><span class="toc-section-number">4.1</span> (4) A clear and concise definition
of the policy proposed.<span></span></a></li>
<li><a href="#proposed-changes-to-the-wording-of-sd-9." id="toc-proposed-changes-to-the-wording-of-sd-9."><span class="toc-section-number">4.2</span> (6) Proposed changes to the
wording of SD-9.<span></span></a></li>
</ul></li>
<li><a href="#bibliography" id="toc-bibliography"><span class="toc-section-number">5</span> References<span></span></a></li>
</ul>
</div>
<h1 data-number="1" id="changelog"><span class="header-section-number">1</span> Changelog<a href="#changelog" class="self-link"></a></h1>
<p>Initial revision.</p>
<h1 data-number="2" id="motivation"><span class="header-section-number">2</span> Motivation<a href="#motivation" class="self-link"></a></h1>
<p>Based on the recently-adopted P2267R1: Library Evolution Policies,
this paper makes the case for a policy for when and why to add
<code class="sourceCode default">explicit</code> to member functions in
standard library templates and types.</p>
<p>There are 721 occurrences of the keyword
<code class="sourceCode default">explicit</code> in the library clauses
of the standard. This does not include the appearance of the keyword in
plain text; this count is of in-code appearances only. This is an
overcount, though, as I overcount duplicates when an
<code class="sourceCode default">explicit</code> member function is
listed in a synopsis and then again in a definition. However, this gives
the sense of how many times
<code class="sourceCode default">explicit</code> is currently used.</p>
<p>These occurrences fall into three distinct categories:</p>
<ol type="1">
<li><p><code class="sourceCode default">explicit operator bool()</code></p></li>
<li><p><code class="sourceCode default">explicit</code> on
single-parameter constructors to prevent undesirable implicit
conversions.</p></li>
<li><p><code class="sourceCode default">explicit</code> on
zero-parameter constructors for tag types, to enforce spelling the tag
type’s name at the point of construction.</p></li>
</ol>
<p>In hundreds of uses of
<code class="sourceCode default">explicit</code>, I found almost no uses
of <code class="sourceCode default">explicit</code> that did not fall
under one of the three categories above (except for views in
<code class="sourceCode default">[ranges]</code> section, discussed
below). This is a pretty good indication that we already use
<code class="sourceCode default">explicit</code> consistently, and that
formalizing this consistency would make a good policy.</p>
<h1 data-number="3" id="requirements-for-this-policy"><span class="header-section-number">3</span> Requirements for this policy<a href="#requirements-for-this-policy" class="self-link"></a></h1>
<p>P2267R1: Library Evolution Policies defines requirements for a new
policy. Below is a discussion of the required elements, based on section
5.1.1 of that paper, using the same numbering from that paper.</p>
<h2 data-number="3.1" id="a-rationale-and-5-a-rationale-as-to-why-adopting-the-policy-will-improve-coherence-and-or-save-time."><span class="header-section-number">3.1</span> (1) A rationale, and (5) A
rationale as to why adopting the policy will improve coherence and / or
save time.<a href="#a-rationale-and-5-a-rationale-as-to-why-adopting-the-policy-will-improve-coherence-and-or-save-time." class="self-link"></a></h2>
<p>We have consistent existing practice for how
<code class="sourceCode default">explicit</code> is used in the standard
library. We also sometimes have to remind authors during design review
to use <code class="sourceCode default">explicit</code>. Having a policy
would save LEWG effort by concretely indicating to paper authors when
and where <code class="sourceCode default">explicit</code> should be
used. A policy will also help paper authors keep uses of
<code class="sourceCode default">explicit</code> to the kinds of uses
indicated in the policy, rather than other ad hoc uses; this will
further help improve coherence.</p>
<p>This rationale applies only to turning the three categories of use
above into policy. There are some uses of
<code class="sourceCode default">explicit</code> in the standard that
are exceptions to those categories.</p>
<ul>
<li><p>The use of <code class="sourceCode default">explicit</code> on
deduction guides (only three in the entire standard). This appears to be
addressed by LWG3451, and so this exception can be ignored.</p></li>
<li><p>The use of <code class="sourceCode default">explicit</code> with
multi-parameter view constructors. This seems to be a special case; this
one of only two places I know about
<code class="sourceCode default">explicit</code> is used on
multi-parameter constructors (the other is next in this list). This does
not seem like something that we should encourage in future proposals,
for the reasons outlined below, in the section on the
<code class="sourceCode default">[ranges]</code> clause.</p></li>
<li><p>The conditional use of
<code class="sourceCode default">explicit</code> with multi-parameter
<code class="sourceCode default">span</code> constructors. As described
in <span class="citation" data-cites="P1976R2">[<a href="#ref-P1976R2" role="doc-biblioref">P1976R2</a>]</span>, the conditional use of
<code class="sourceCode default">explicit</code> is intended to make it
less likely for the user to write UB into their code when constructing a
non-<code class="sourceCode default">dynamic_extent</code>
<code class="sourceCode default">span</code> from a pointer and size or
a pair of iterators. This also seems like a fairly particular use of
<code class="sourceCode default">explicit</code>, ill-suited to be
turned into a broad rule.</p></li>
<li><p>The use of <code class="sourceCode default">explicit</code> on
select conversion operators in classes in
<code class="sourceCode default">[time]</code>. The usage there is to
make an explicit conversion possible with a cast, while disallowing that
conversion implicitly. This is certain to come up from time to time, but
not often. For now, it seems best not to try to make this use of
<code class="sourceCode default">explicit</code> part of the policy. We
can always add it later if it becomes common.</p></li>
</ul>
<p>The take-away here is that the three rules proposed in this paper are
applied with a high level of consistency in the standard today. Though
there are plenty of other uses of
<code class="sourceCode default">explicit</code>, as outlined above,
none of those uses is contrary to the three rules proposed.</p>
<h2 data-number="3.2" id="a-survey-of-the-prior-art-of-the-topic-as-appears-in-the-standard."><span class="header-section-number">3.2</span> (2) A survey of the prior art
of the topic, as appears in the standard.<a href="#a-survey-of-the-prior-art-of-the-topic-as-appears-in-the-standard." class="self-link"></a></h2>
<p>Here is a breakdown of the use of
<code class="sourceCode default">explicit</code> in the library clauses,
clause by clause.</p>
<h3 data-number="3.2.1" id="support-9-occurrences"><span class="header-section-number">3.2.1</span>
<code class="sourceCode default">[support]</code> (9 occurrences)<a href="#support-9-occurrences" class="self-link"></a></h3>
<p>Used on
<code class="sourceCode default">partial</code>/<code class="sourceCode default">strong</code>/<code class="sourceCode default">weak_ordering</code>,
e.g.:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> partial_ordering<span class="op">(</span>ord v<span class="op">)</span> <span class="kw">noexcept</span>;</span></code></pre></div>
<p><code class="sourceCode default">explicit</code> is used to prevent
implicit conversions from (exposition-only
<code class="sourceCode default">enum</code>)
<code class="sourceCode default">ord</code> to
<code class="sourceCode default">partial_ordering</code>.</p>
<h3 data-number="3.2.2" id="diagnostics-26-occurrences"><span class="header-section-number">3.2.2</span>
<code class="sourceCode default">[diagnostics]</code> (26 occurrences)<a href="#diagnostics-26-occurrences" class="self-link"></a></h3>
<p>Used on the constructors for various exception types that take a
<code class="sourceCode default">string</code>, and the constructors of
various types that take an allocator, e.g.:</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="kw">explicit</span> logic_error<span class="op">(</span><span class="kw">const</span> string<span class="op">&amp;</span> what_arg<span class="op">)</span>;</span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a><span class="kw">explicit</span> basic_stacktrace<span class="op">(</span><span class="kw">const</span> allocator_type<span class="op">&amp;</span> alloc<span class="op">)</span> <span class="kw">noexcept</span>;</span></code></pre></div>
<p>Used in <code class="sourceCode default">explicit operator bool() const noexcept</code>.</p>
<h3 data-number="3.2.3" id="mem-25-occurrences"><span class="header-section-number">3.2.3</span>
<code class="sourceCode default">[mem]</code> (25 occurrences)<a href="#mem-25-occurrences" class="self-link"></a></h3>
<p>Used on various smart pointers’ constructors, e.g.:</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> U<span class="op">&gt;</span> <span class="kw">constexpr</span> <span class="kw">explicit</span> unique_ptr<span class="op">(</span>U p<span class="op">)</span> <span class="kw">noexcept</span>;</span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Y<span class="op">&gt;</span> <span class="kw">explicit</span> shared_ptr<span class="op">(</span>Y<span class="op">*</span> p<span class="op">)</span>;</span></code></pre></div>
<p>Used in <code class="sourceCode default">explicit operator bool() const noexcept</code>.</p>
<h3 data-number="3.2.4" id="utilities-83-occurrences"><span class="header-section-number">3.2.4</span>
<code class="sourceCode default">[utilities]</code> (83 occurrences)<a href="#utilities-83-occurrences" class="self-link"></a></h3>
<p>Used on the constructors of various utility templates, e.g.:</p>
<div class="sourceCode" id="cb4"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span><span class="op">...</span> Args<span class="op">&gt;</span></span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a>  <span class="kw">constexpr</span> <span class="kw">explicit</span> optional<span class="op">(</span>in_place_t, Args<span class="op">&amp;&amp;...)</span>;</span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="dt">size_t</span> I, <span class="kw">class</span><span class="op">...</span> Args<span class="op">&gt;</span></span>
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a>  <span class="kw">constexpr</span> <span class="kw">explicit</span> variant<span class="op">(</span>in_place_index_t<span class="op">&lt;</span>I<span class="op">&gt;</span>, Args<span class="op">&amp;&amp;...)</span>;</span>
<span id="cb4-5"><a href="#cb4-5" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> T, <span class="kw">class</span><span class="op">...</span> Args<span class="op">&gt;</span></span>
<span id="cb4-6"><a href="#cb4-6" aria-hidden="true" tabindex="-1"></a>  <span class="kw">explicit</span> any<span class="op">(</span>in_place_type_t<span class="op">&lt;</span>T<span class="op">&gt;</span>, Args<span class="op">&amp;&amp;...)</span>;</span>
<span id="cb4-7"><a href="#cb4-7" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Err <span class="op">=</span> E<span class="op">&gt;</span></span>
<span id="cb4-8"><a href="#cb4-8" aria-hidden="true" tabindex="-1"></a>  <span class="kw">constexpr</span> <span class="kw">explicit</span> unexpected<span class="op">(</span>Err<span class="op">&amp;&amp;)</span>;</span>
<span id="cb4-9"><a href="#cb4-9" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span><span class="op">...</span> Args<span class="op">&gt;</span></span>
<span id="cb4-10"><a href="#cb4-10" aria-hidden="true" tabindex="-1"></a>  <span class="kw">constexpr</span> <span class="kw">explicit</span> expected<span class="op">(</span>in_place_t, Args<span class="op">&amp;&amp;...)</span>;</span>
<span id="cb4-11"><a href="#cb4-11" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> charT, <span class="kw">class</span> traits, <span class="kw">class</span> Allocator<span class="op">&gt;</span></span>
<span id="cb4-12"><a href="#cb4-12" aria-hidden="true" tabindex="-1"></a>  <span class="kw">constexpr</span> <span class="kw">explicit</span> bitset<span class="op">(</span></span>
<span id="cb4-13"><a href="#cb4-13" aria-hidden="true" tabindex="-1"></a>    <span class="kw">const</span> basic_string<span class="op">&lt;</span>charT, traits, Allocator<span class="op">&gt;&amp;</span> str,</span>
<span id="cb4-14"><a href="#cb4-14" aria-hidden="true" tabindex="-1"></a>    <span class="kw">typename</span> basic_string<span class="op">&lt;</span>charT, traits, Allocator<span class="op">&gt;::</span>size_type pos <span class="op">=</span> <span class="dv">0</span>,</span>
<span id="cb4-15"><a href="#cb4-15" aria-hidden="true" tabindex="-1"></a>    <span class="kw">typename</span> basic_string<span class="op">&lt;</span>charT, traits, Allocator<span class="op">&gt;::</span>size_type n</span>
<span id="cb4-16"><a href="#cb4-16" aria-hidden="true" tabindex="-1"></a>      <span class="op">=</span> basic_string<span class="op">&lt;</span>charT, traits, Allocator<span class="op">&gt;::</span>npos,</span>
<span id="cb4-17"><a href="#cb4-17" aria-hidden="true" tabindex="-1"></a>    charT zero <span class="op">=</span> charT<span class="op">(</span><span class="ch">&#39;0&#39;</span><span class="op">)</span>,</span>
<span id="cb4-18"><a href="#cb4-18" aria-hidden="true" tabindex="-1"></a>    charT one <span class="op">=</span> charT<span class="op">(</span><span class="ch">&#39;1&#39;</span><span class="op">))</span>;</span>
<span id="cb4-19"><a href="#cb4-19" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> T, <span class="kw">class</span><span class="op">...</span> Args<span class="op">&gt;</span></span>
<span id="cb4-20"><a href="#cb4-20" aria-hidden="true" tabindex="-1"></a>  <span class="kw">explicit</span> move_only_function<span class="op">(</span>in_place_type_t<span class="op">&lt;</span>T<span class="op">&gt;</span>, Args<span class="op">&amp;&amp;...)</span>;</span>
<span id="cb4-21"><a href="#cb4-21" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> T, <span class="kw">class</span><span class="op">...</span> Args<span class="op">&gt;</span></span>
<span id="cb4-22"><a href="#cb4-22" aria-hidden="true" tabindex="-1"></a>  <span class="kw">explicit</span> copyable_function<span class="op">(</span>in_place_type_t<span class="op">&lt;</span>T<span class="op">&gt;</span>, Args<span class="op">&amp;&amp;...)</span>;</span>
<span id="cb4-23"><a href="#cb4-23" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> basic_format_parse_context<span class="op">(</span>basic_string_view<span class="op">&lt;</span>charT<span class="op">&gt;</span> fmt<span class="op">)</span> <span class="kw">noexcept</span>;</span>
<span id="cb4-24"><a href="#cb4-24" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> T<span class="op">&gt;</span> <span class="kw">explicit</span> basic_format_arg<span class="op">(</span>T<span class="op">&amp;</span> v<span class="op">)</span> <span class="kw">noexcept</span>;</span></code></pre></div>
<p>Used on various exceptions’ constructors.</p>
<p>Used in <code class="sourceCode default">explicit operator bool() const noexcept</code>.</p>
<h3 data-number="3.2.5" id="strings-8-occurrences"><span class="header-section-number">3.2.5</span>
<code class="sourceCode default">[strings]</code> (8 occurrences)<a href="#strings-8-occurrences" class="self-link"></a></h3>
<p>Used on <code class="sourceCode default">basic_string</code> and
<code class="sourceCode default">basic_string_view</code> constructors,
e.g.:</p>
<div class="sourceCode" id="cb5"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> R<span class="op">&gt;</span></span>
<span id="cb5-2"><a href="#cb5-2" aria-hidden="true" tabindex="-1"></a>  <span class="kw">constexpr</span> <span class="kw">explicit</span> basic_string_view<span class="op">(</span>R<span class="op">&amp;&amp;</span> r<span class="op">)</span>;</span>
<span id="cb5-3"><a href="#cb5-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb5-4"><a href="#cb5-4" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> basic_string<span class="op">(</span><span class="kw">const</span> Allocator<span class="op">&amp;</span> a<span class="op">)</span> <span class="kw">noexcept</span>;</span></code></pre></div>
<p>Used on two <code class="sourceCode default">basic_string</code>
deduction guides:</p>
<div class="sourceCode" id="cb6"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> charT,</span>
<span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a>         <span class="kw">class</span> traits,</span>
<span id="cb6-3"><a href="#cb6-3" aria-hidden="true" tabindex="-1"></a>         <span class="kw">class</span> Allocator <span class="op">=</span> allocator<span class="op">&lt;</span>charT<span class="op">&gt;&gt;</span></span>
<span id="cb6-4"><a href="#cb6-4" aria-hidden="true" tabindex="-1"></a>  <span class="kw">explicit</span> basic_string<span class="op">(</span>basic_string_view<span class="op">&lt;</span>charT, traits<span class="op">&gt;</span>, <span class="kw">const</span> Allocator<span class="op">&amp;</span> <span class="op">=</span> Allocator<span class="op">())</span></span>
<span id="cb6-5"><a href="#cb6-5" aria-hidden="true" tabindex="-1"></a>    <span class="op">-&gt;</span> basic_string<span class="op">&lt;</span>charT, traits, Allocator<span class="op">&gt;</span>;</span>
<span id="cb6-6"><a href="#cb6-6" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb6-7"><a href="#cb6-7" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> charT,</span>
<span id="cb6-8"><a href="#cb6-8" aria-hidden="true" tabindex="-1"></a>         <span class="kw">class</span> traits,</span>
<span id="cb6-9"><a href="#cb6-9" aria-hidden="true" tabindex="-1"></a>         <span class="kw">class</span> Allocator <span class="op">=</span> allocator<span class="op">&lt;</span>charT<span class="op">&gt;&gt;</span></span>
<span id="cb6-10"><a href="#cb6-10" aria-hidden="true" tabindex="-1"></a>  basic_string<span class="op">(</span>basic_string_view<span class="op">&lt;</span>charT, traits<span class="op">&gt;</span>,</span>
<span id="cb6-11"><a href="#cb6-11" aria-hidden="true" tabindex="-1"></a>               <span class="kw">typename</span> see below<span class="op">::</span>size_type, <span class="kw">typename</span> see below<span class="op">::</span>size_type,</span>
<span id="cb6-12"><a href="#cb6-12" aria-hidden="true" tabindex="-1"></a>               <span class="kw">const</span> Allocator<span class="op">&amp;</span> <span class="op">=</span> Allocator<span class="op">())</span></span>
<span id="cb6-13"><a href="#cb6-13" aria-hidden="true" tabindex="-1"></a>    <span class="op">-&gt;</span> basic_string<span class="op">&lt;</span>charT, traits, Allocator<span class="op">&gt;</span>;</span></code></pre></div>
<p>These guides are part of the subject of LWG3451 (see below).</p>
<h3 data-number="3.2.6" id="containers-87-occurrences"><span class="header-section-number">3.2.6</span>
<code class="sourceCode default">[containers]</code> (87 occurrences)<a href="#containers-87-occurrences" class="self-link"></a></h3>
<p>Used on constructors that may take a single argument, e.g.:</p>
<div class="sourceCode" id="cb7"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a><span class="kw">explicit</span> deque<span class="op">(</span><span class="kw">const</span> Allocator<span class="op">&amp;)</span>;</span>
<span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-3"><a href="#cb7-3" aria-hidden="true" tabindex="-1"></a><span class="kw">explicit</span> unordered_map<span class="op">(</span>size_type n,</span>
<span id="cb7-4"><a href="#cb7-4" aria-hidden="true" tabindex="-1"></a>                       <span class="kw">const</span> hasher<span class="op">&amp;</span> hf <span class="op">=</span> hasher<span class="op">()</span>,</span>
<span id="cb7-5"><a href="#cb7-5" aria-hidden="true" tabindex="-1"></a>                       <span class="kw">const</span> key_equal<span class="op">&amp;</span> eql <span class="op">=</span> key_equal<span class="op">()</span>,</span>
<span id="cb7-6"><a href="#cb7-6" aria-hidden="true" tabindex="-1"></a>                       <span class="kw">const</span> allocator_type<span class="op">&amp;</span> a <span class="op">=</span> allocator_type<span class="op">())</span>;</span>
<span id="cb7-7"><a href="#cb7-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-8"><a href="#cb7-8" aria-hidden="true" tabindex="-1"></a><span class="kw">explicit</span> queue<span class="op">(</span><span class="kw">const</span> Container<span class="op">&amp;</span> cont<span class="op">)</span>;</span>
<span id="cb7-9"><a href="#cb7-9" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-10"><a href="#cb7-10" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span><span class="op">...</span> OtherIndexTypes<span class="op">&gt;</span></span>
<span id="cb7-11"><a href="#cb7-11" aria-hidden="true" tabindex="-1"></a>  <span class="kw">constexpr</span> <span class="kw">explicit</span> extents<span class="op">(</span>OtherIndexTypes<span class="op">...)</span> <span class="kw">noexcept</span>;</span>
<span id="cb7-12"><a href="#cb7-12" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-13"><a href="#cb7-13" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span><span class="op">...</span> OtherIndexTypes<span class="op">&gt;</span></span>
<span id="cb7-14"><a href="#cb7-14" aria-hidden="true" tabindex="-1"></a>  <span class="kw">constexpr</span> <span class="kw">explicit</span> mdspan<span class="op">(</span>data_handle_type ptr, OtherIndexTypes<span class="op">...</span> exts<span class="op">)</span>;</span></code></pre></div>
<p>Used conditionally on various
<code class="sourceCode default">span</code> multi-argument
constructors:</p>
<div class="sourceCode" id="cb8"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> It<span class="op">&gt;</span></span>
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a>  <span class="kw">constexpr</span> <span class="kw">explicit</span><span class="op">(</span>extent <span class="op">!=</span> dynamic_extent<span class="op">)</span> span<span class="op">(</span>It first, size_type count<span class="op">)</span>;</span>
<span id="cb8-3"><a href="#cb8-3" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> It, <span class="kw">class</span> End<span class="op">&gt;</span></span>
<span id="cb8-4"><a href="#cb8-4" aria-hidden="true" tabindex="-1"></a>  <span class="kw">constexpr</span> <span class="kw">explicit</span><span class="op">(</span>extent <span class="op">!=</span> dynamic_extent<span class="op">)</span> span<span class="op">(</span>It first, End last<span class="op">)</span>;</span>
<span id="cb8-5"><a href="#cb8-5" aria-hidden="true" tabindex="-1"></a>  <span class="kw">constexpr</span> <span class="kw">explicit</span><span class="op">(</span>extent <span class="op">!=</span> dynamic_extent<span class="op">)</span> span<span class="op">(</span>R<span class="op">&amp;&amp;</span> r<span class="op">)</span>;</span>
<span id="cb8-6"><a href="#cb8-6" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span><span class="op">(</span>extent <span class="op">!=</span> dynamic_extent<span class="op">)</span> span<span class="op">(</span>std<span class="op">::</span>initializer_list<span class="op">&lt;</span>value_type<span class="op">&gt;</span> il<span class="op">)</span>;</span>
<span id="cb8-7"><a href="#cb8-7" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> OtherElementType, <span class="dt">size_t</span> OtherExtent<span class="op">&gt;</span></span>
<span id="cb8-8"><a href="#cb8-8" aria-hidden="true" tabindex="-1"></a>  <span class="kw">constexpr</span> <span class="kw">explicit</span><span class="op">(</span>see below<span class="op">)</span> span<span class="op">(</span><span class="kw">const</span> span<span class="op">&lt;</span>OtherElementType, OtherExtent<span class="op">&gt;&amp;</span> s<span class="op">)</span> <span class="kw">noexcept</span>;</span></code></pre></div>
<p>Used in tag types like
<code class="sourceCode default">sorted_t</code>.</p>
<p>Used in <code class="sourceCode default">explicit operator bool() const noexcept</code>.</p>
<h3 data-number="3.2.7" id="iterators-10-occurrences"><span class="header-section-number">3.2.7</span>
<code class="sourceCode default">[iterators]</code> (10 occurrences)<a href="#iterators-10-occurrences" class="self-link"></a></h3>
<p>Used on various adapting iterators’ constructors, e.g.:</p>
<div class="sourceCode" id="cb9"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> reverse_iterator<span class="op">(</span>Iterator x<span class="op">)</span>;</span>
<span id="cb9-2"><a href="#cb9-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb9-3"><a href="#cb9-3" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> back_insert_iterator<span class="op">(</span>Container<span class="op">&amp;</span> x<span class="op">)</span>;</span></code></pre></div>
<h3 data-number="3.2.8" id="ranges-138-occurrences"><span class="header-section-number">3.2.8</span>
<code class="sourceCode default">[ranges]</code> (138 occurrences)<a href="#ranges-138-occurrences" class="self-link"></a></h3>
<p>Used on various views’ constructors that may take a single argument,
e.g.:</p>
<div class="sourceCode" id="cb10"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> single_view<span class="op">(</span><span class="kw">const</span> T<span class="op">&amp;</span> t<span class="op">)</span> <span class="kw">requires</span> copy_constructible<span class="op">&lt;</span>T<span class="op">&gt;</span>;</span>
<span id="cb10-2"><a href="#cb10-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb10-3"><a href="#cb10-3" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> iota_view<span class="op">(</span>W value<span class="op">)</span>;</span></code></pre></div>
<p>Used on various views’ nested iterator and adaptor types’
constructors, e.g.:</p>
<div class="sourceCode" id="cb11"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true" tabindex="-1"></a><span class="co">// Within struct iota_view&lt;W, Bound&gt;::iterator.</span></span>
<span id="cb11-2"><a href="#cb11-2" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> iterator<span class="op">(</span>W value<span class="op">)</span>;</span></code></pre></div>
<p>Used on the <code class="sourceCode default">join_view</code>
deduction guide:</p>
<div class="sourceCode" id="cb12"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> R<span class="op">&gt;</span></span>
<span id="cb12-2"><a href="#cb12-2" aria-hidden="true" tabindex="-1"></a>    <span class="kw">explicit</span> join_view<span class="op">(</span>R<span class="op">&amp;&amp;)</span> <span class="op">-&gt;</span> join_view<span class="op">&lt;</span>views<span class="op">::</span>all_t<span class="op">&lt;</span>R<span class="op">&gt;&gt;</span>;</span></code></pre></div>
<p>This is the subject of LWG3451, “Inconsistently explicit deduction
guides”
(https://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#3451),
along with the <code class="sourceCode default">basic_string</code>
deduction guides mentioned previously. The issue recommends that the
<code class="sourceCode default">explicit</code> be struck from all
three deduction guides. The issue seems to have been accepted as P3;
these three deduction guides seem to be safe to ignore.</p>
<p>Used in <code class="sourceCode default">explicit operator bool() const noexcept</code>.</p>
<p>There are a few templates in this clause that have intentionally
non-<code class="sourceCode default">explicit</code> single-argument
constructors:</p>
<div class="sourceCode" id="cb13"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> R, <span class="kw">class</span> Allocator <span class="op">=</span> allocator<span class="op">&lt;</span>byte<span class="op">&gt;&gt;</span></span>
<span id="cb13-2"><a href="#cb13-2" aria-hidden="true" tabindex="-1"></a>  elements_of<span class="op">(</span>R<span class="op">&amp;&amp;</span>, Allocator <span class="op">=</span> Allocator<span class="op">())</span> <span class="op">-&gt;</span> elements_of<span class="op">&lt;</span>R<span class="op">&amp;&amp;</span>, Allocator<span class="op">&gt;</span>;</span>
<span id="cb13-3"><a href="#cb13-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb13-4"><a href="#cb13-4" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span>different<span class="op">-</span>from<span class="op">&lt;</span>ref_view<span class="op">&gt;</span> T<span class="op">&gt;</span></span>
<span id="cb13-5"><a href="#cb13-5" aria-hidden="true" tabindex="-1"></a>  <span class="kw">requires</span> see below</span>
<span id="cb13-6"><a href="#cb13-6" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> ref_view<span class="op">(</span>T<span class="op">&amp;&amp;</span> t<span class="op">)</span>;</span>
<span id="cb13-7"><a href="#cb13-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb13-8"><a href="#cb13-8" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> owning_view<span class="op">(</span>R<span class="op">&amp;&amp;</span> t<span class="op">)</span>;</span></code></pre></div>
<p>There are also a few view templates in this clause that have
multi-argument constructors that are marked
<code class="sourceCode default">explicit</code>:</p>
<div class="sourceCode" id="cb14"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb14-1"><a href="#cb14-1" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> iota_view<span class="op">(</span>type_identity_t<span class="op">&lt;</span>W<span class="op">&gt;</span> value, type_identity_t<span class="op">&lt;</span>Bound<span class="op">&gt;</span> bound<span class="op">)</span>;</span>
<span id="cb14-2"><a href="#cb14-2" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> iota_view<span class="op">(</span>iterator first, see below last<span class="op">)</span>;</span>
<span id="cb14-3"><a href="#cb14-3" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> repeat_view<span class="op">(</span>piecewise_construct_t,</span>
<span id="cb14-4"><a href="#cb14-4" aria-hidden="true" tabindex="-1"></a>                               tuple<span class="op">&lt;</span>TArgs<span class="op">...&gt;</span> value_args, tuple<span class="op">&lt;</span>BoundArgs<span class="op">...&gt;</span> bound_args <span class="op">=</span> tuple<span class="op">&lt;&gt;{})</span>;</span>
<span id="cb14-5"><a href="#cb14-5" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> repeat_view<span class="op">(</span>piecewise_construct_t,</span>
<span id="cb14-6"><a href="#cb14-6" aria-hidden="true" tabindex="-1"></a>                               tuple<span class="op">&lt;</span>TArgs<span class="op">...&gt;</span> value_args, tuple<span class="op">&lt;</span>BoundArgs<span class="op">...&gt;</span> bound_args <span class="op">=</span> tuple<span class="op">&lt;&gt;{})</span>;</span>
<span id="cb14-7"><a href="#cb14-7" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> transform_view<span class="op">(</span>V base, F fun<span class="op">)</span>;</span>
<span id="cb14-8"><a href="#cb14-8" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> take_view<span class="op">(</span>V base, range_difference_t<span class="op">&lt;</span>V<span class="op">&gt;</span> count<span class="op">)</span>;</span>
<span id="cb14-9"><a href="#cb14-9" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> take_while_view<span class="op">(</span>V base, Pred pred<span class="op">)</span>;</span>
<span id="cb14-10"><a href="#cb14-10" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> drop_view<span class="op">(</span>V base, range_difference_t<span class="op">&lt;</span>V<span class="op">&gt;</span> count<span class="op">)</span>;</span>
<span id="cb14-11"><a href="#cb14-11" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> drop_while_view<span class="op">(</span>V base, Pred pred<span class="op">)</span>;</span>
<span id="cb14-12"><a href="#cb14-12" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> join_with_view<span class="op">(</span>V base, Pattern pattern<span class="op">)</span>;</span>
<span id="cb14-13"><a href="#cb14-13" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> lazy_split_view<span class="op">(</span>R<span class="op">&amp;&amp;</span> r, range_value_t<span class="op">&lt;</span>R<span class="op">&gt;</span> e<span class="op">)</span>;</span>
<span id="cb14-14"><a href="#cb14-14" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> split_view<span class="op">(</span>V base, Pattern pattern<span class="op">)</span>;</span>
<span id="cb14-15"><a href="#cb14-15" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> adjacent_transform_view<span class="op">(</span>V base, F fun<span class="op">)</span>;</span>
<span id="cb14-16"><a href="#cb14-16" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> chunk_view<span class="op">(</span>V base, range_difference_t<span class="op">&lt;</span>V<span class="op">&gt;</span> n<span class="op">)</span>;</span>
<span id="cb14-17"><a href="#cb14-17" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> slide_view<span class="op">(</span>V base, range_difference_t<span class="op">&lt;</span>V<span class="op">&gt;</span> n<span class="op">)</span>;</span>
<span id="cb14-18"><a href="#cb14-18" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> chunk_by_view<span class="op">(</span>V base, Pred pred<span class="op">)</span>;</span>
<span id="cb14-19"><a href="#cb14-19" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> stride_view<span class="op">(</span>V base, range_difference_t<span class="op">&lt;</span>V<span class="op">&gt;</span> stride<span class="op">)</span>;</span></code></pre></div>
<p>This differs from other templates in the standard. There is an
associated paper <span class="citation" data-cites="P2711R1">[<a href="#ref-P2711R1" role="doc-biblioref">P2711R1</a>]</span>: Making
multi-param constructors of views explicit, which was discussed at the
Kona 2022 meeting.</p>
<p>The intention here is to eliminate the difference in user code
between a single- and multi-argument call to one of these view’s
constructors. If they’re all
<code class="sourceCode default">explicit</code>, then
<code class="sourceCode default">foo_view x = {arg};</code> and
<code class="sourceCode default">foo_view x = {arg1, arg2};</code> will
both be ill-formed, which is more consistent. As the paper points out,
users will almost always be using the range adaptors and not
constructing views directly, and the inconsistency problem itself it not
very serious.</p>
<h3 data-number="3.2.9" id="numerics-90-occurrences"><span class="header-section-number">3.2.9</span>
<code class="sourceCode default">[numerics]</code> (90 occurrences)<a href="#numerics-90-occurrences" class="self-link"></a></h3>
<p>Used on various templates in random number generation, e.g.:</p>
<div class="sourceCode" id="cb15"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb15-1"><a href="#cb15-1" aria-hidden="true" tabindex="-1"></a><span class="kw">explicit</span> linear_congruential_engine<span class="op">(</span>result_type s<span class="op">)</span>;</span>
<span id="cb15-2"><a href="#cb15-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb15-3"><a href="#cb15-3" aria-hidden="true" tabindex="-1"></a><span class="kw">explicit</span> bernoulli_distribution<span class="op">(</span><span class="dt">double</span> p<span class="op">)</span>;</span></code></pre></div>
<p>Used on <code class="sourceCode default">valarray</code>:
<code class="sourceCode default">explicit valarray(size_t);</code>.</p>
<p>Used on various templates in
<code class="sourceCode default">linalg</code>, e.g.</p>
<div class="sourceCode" id="cb16"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb16-1"><a href="#cb16-1" aria-hidden="true" tabindex="-1"></a><span class="co">// inside template&lt;class Layout&gt; class layout_transpose</span></span>
<span id="cb16-2"><a href="#cb16-2" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> mapping<span class="op">(</span><span class="kw">const</span> nested<span class="op">-</span>mapping<span class="op">-</span>type<span class="op">&amp;)</span>;</span></code></pre></div>
<h3 data-number="3.2.10" id="time-47-occurrences"><span class="header-section-number">3.2.10</span>
<code class="sourceCode default">[time]</code> (47 occurrences)<a href="#time-47-occurrences" class="self-link"></a></h3>
<p>Used on various time templates, e.g.:</p>
<div class="sourceCode" id="cb17"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb17-1"><a href="#cb17-1" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> Rep2<span class="op">&gt;</span></span>
<span id="cb17-2"><a href="#cb17-2" aria-hidden="true" tabindex="-1"></a>  <span class="kw">constexpr</span> <span class="kw">explicit</span> duration<span class="op">(</span><span class="kw">const</span> Rep2<span class="op">&amp;</span> r<span class="op">)</span>;</span>
<span id="cb17-3"><a href="#cb17-3" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> time_point<span class="op">(</span><span class="kw">const</span> duration<span class="op">&amp;</span> d<span class="op">)</span>;</span>
<span id="cb17-4"><a href="#cb17-4" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> day<span class="op">(</span><span class="dt">unsigned</span> d<span class="op">)</span> <span class="kw">noexcept</span>;</span></code></pre></div>
<p><code class="sourceCode default">explicit</code> is also used on a
few conversion operators in this clause, e.g.:</p>
<div class="sourceCode" id="cb18"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb18-1"><a href="#cb18-1" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> day<span class="op">::</span><span class="kw">operator</span> <span class="dt">unsigned</span><span class="op">()</span> <span class="kw">const</span> <span class="kw">noexcept</span>;</span>
<span id="cb18-2"><a href="#cb18-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb18-3"><a href="#cb18-3" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> month<span class="op">::</span><span class="kw">operator</span> <span class="dt">unsigned</span><span class="op">()</span> <span class="kw">const</span> <span class="kw">noexcept</span>;</span>
<span id="cb18-4"><a href="#cb18-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb18-5"><a href="#cb18-5" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span>          year_month_day<span class="op">::</span><span class="kw">operator</span> sys_days<span class="op">()</span>   <span class="kw">const</span> <span class="kw">noexcept</span>;</span>
<span id="cb18-6"><a href="#cb18-6" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> year_month_day<span class="op">::</span><span class="kw">operator</span> local_days<span class="op">()</span> <span class="kw">const</span> <span class="kw">noexcept</span>;</span>
<span id="cb18-7"><a href="#cb18-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb18-8"><a href="#cb18-8" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span>          year_month_day_last<span class="op">::</span><span class="kw">operator</span> sys_days<span class="op">()</span>   <span class="kw">const</span> <span class="kw">noexcept</span>;</span>
<span id="cb18-9"><a href="#cb18-9" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> year_month_day_last<span class="op">::</span><span class="kw">operator</span> local_days<span class="op">()</span> <span class="kw">const</span> <span class="kw">noexcept</span>;</span></code></pre></div>
<p>The intention here appears to be to allow implicit conversions in
some places, and to create other explicit conversions that require
explicit opt-in, using a cast.</p>
<h3 data-number="3.2.11" id="localization-38-occurrences"><span class="header-section-number">3.2.11</span>
<code class="sourceCode default">[localization]</code> (38
occurrences)<a href="#localization-38-occurrences" class="self-link"></a></h3>
<p>Used on various locales, facets, etc., e.g.:</p>
<div class="sourceCode" id="cb19"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb19-1"><a href="#cb19-1" aria-hidden="true" tabindex="-1"></a><span class="kw">explicit</span> locale<span class="op">(</span><span class="kw">const</span> <span class="dt">char</span><span class="op">*</span> std_name<span class="op">)</span>;</span>
<span id="cb19-2"><a href="#cb19-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb19-3"><a href="#cb19-3" aria-hidden="true" tabindex="-1"></a><span class="kw">explicit</span> collate_byname<span class="op">(</span><span class="kw">const</span> <span class="dt">char</span><span class="op">*</span>, <span class="dt">size_t</span> refs <span class="op">=</span> <span class="dv">0</span><span class="op">)</span>;</span></code></pre></div>
<h3 data-number="3.2.12" id="input.output-110-occurrences"><span class="header-section-number">3.2.12</span>
<code class="sourceCode default">[input.output]</code> (110
occurrences)<a href="#input.output-110-occurrences" class="self-link"></a></h3>
<p>Used on various exception templates, e.g.:</p>
<div class="sourceCode" id="cb20"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb20-1"><a href="#cb20-1" aria-hidden="true" tabindex="-1"></a><span class="kw">explicit</span> ios_base<span class="op">::</span>failure<span class="op">(</span><span class="kw">const</span> string<span class="op">&amp;</span> msg, <span class="kw">const</span> error_code<span class="op">&amp;</span> ec <span class="op">=</span> io_errc<span class="op">::</span>stream<span class="op">)</span>;</span></code></pre></div>
<p>Used on various stream and buf templates, e.g.:</p>
<div class="sourceCode" id="cb21"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb21-1"><a href="#cb21-1" aria-hidden="true" tabindex="-1"></a><span class="kw">explicit</span> basic_istream<span class="op">(</span>basic_streambuf<span class="op">&lt;</span>charT, traits<span class="op">&gt;*</span> sb<span class="op">)</span>;</span></code></pre></div>
<p>Used on various filesystem templates, e.g.:</p>
<div class="sourceCode" id="cb22"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb22-1"><a href="#cb22-1" aria-hidden="true" tabindex="-1"></a><span class="kw">explicit</span> directory_iterator<span class="op">(</span><span class="kw">const</span> path<span class="op">&amp;</span> p<span class="op">)</span>;</span></code></pre></div>
<p>Used in <code class="sourceCode default">explicit operator bool() const noexcept</code>.</p>
<h3 data-number="3.2.13" id="re-7-occurrences"><span class="header-section-number">3.2.13</span>
<code class="sourceCode default">[re]</code> (7 occurrences)<a href="#re-7-occurrences" class="self-link"></a></h3>
<p>Used on an exception type:</p>
<div class="sourceCode" id="cb23"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb23-1"><a href="#cb23-1" aria-hidden="true" tabindex="-1"></a><span class="kw">explicit</span> regex_error<span class="op">(</span>regex_constants<span class="op">::</span>error_type ecode<span class="op">)</span>;</span></code></pre></div>
<p>Used on various regex templates, e.g.:</p>
<div class="sourceCode" id="cb24"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb24-1"><a href="#cb24-1" aria-hidden="true" tabindex="-1"></a><span class="kw">explicit</span> basic_regex<span class="op">(</span><span class="kw">const</span> charT<span class="op">*</span> p, flag_type f <span class="op">=</span> regex_constants<span class="op">::</span>ECMAScript<span class="op">)</span>;</span>
<span id="cb24-2"><a href="#cb24-2" aria-hidden="true" tabindex="-1"></a><span class="kw">explicit</span> match_results<span class="op">(</span><span class="kw">const</span> Allocator<span class="op">&amp;</span> a<span class="op">)</span>;</span></code></pre></div>
<h3 data-number="3.2.14" id="thread-43-occurrences"><span class="header-section-number">3.2.14</span>
<code class="sourceCode default">[thread]</code> (43 occurrences)<a href="#thread-43-occurrences" class="self-link"></a></h3>
<p>Used on various templates related to threads, e.g.:</p>
<div class="sourceCode" id="cb25"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb25-1"><a href="#cb25-1" aria-hidden="true" tabindex="-1"></a><span class="kw">explicit</span> stop_source<span class="op">(</span>nostopstate_t<span class="op">)</span> <span class="kw">noexcept</span>;</span>
<span id="cb25-2"><a href="#cb25-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb25-3"><a href="#cb25-3" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> C<span class="op">&gt;</span></span>
<span id="cb25-4"><a href="#cb25-4" aria-hidden="true" tabindex="-1"></a>  <span class="kw">explicit</span> stop_callback<span class="op">(</span><span class="kw">const</span> stop_token<span class="op">&amp;</span> st, C<span class="op">&amp;&amp;</span> cb<span class="op">)</span></span>
<span id="cb25-5"><a href="#cb25-5" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb25-6"><a href="#cb25-6" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> F, <span class="kw">class</span><span class="op">...</span> Args<span class="op">&gt;</span> <span class="kw">explicit</span> thread<span class="op">(</span>F<span class="op">&amp;&amp;</span> f, Args<span class="op">&amp;&amp;...</span> args<span class="op">)</span>;</span>
<span id="cb25-7"><a href="#cb25-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb25-8"><a href="#cb25-8" aria-hidden="true" tabindex="-1"></a><span class="kw">explicit</span> atomic_ref<span class="op">(</span>T<span class="op">&amp;)</span>;</span></code></pre></div>
<p>Used on various lock templates, e.g.:</p>
<div class="sourceCode" id="cb26"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb26-1"><a href="#cb26-1" aria-hidden="true" tabindex="-1"></a><span class="kw">explicit</span> lock_guard<span class="op">(</span>mutex_type<span class="op">&amp;</span> m<span class="op">)</span>;</span>
<span id="cb26-2"><a href="#cb26-2" aria-hidden="true" tabindex="-1"></a><span class="kw">explicit</span> scoped_lock<span class="op">(</span>MutexTypes<span class="op">&amp;...</span> m<span class="op">)</span>;</span></code></pre></div>
<p>Used on an exception type:</p>
<div class="sourceCode" id="cb27"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb27-1"><a href="#cb27-1" aria-hidden="true" tabindex="-1"></a><span class="kw">explicit</span> future_error<span class="op">(</span>future_errc e<span class="op">)</span>;</span></code></pre></div>
<p>Used on various other templates, e.g.:</p>
<div class="sourceCode" id="cb28"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb28-1"><a href="#cb28-1" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> counting_semaphore<span class="op">(</span><span class="dt">ptrdiff_t</span> desired<span class="op">)</span>;</span>
<span id="cb28-2"><a href="#cb28-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb28-3"><a href="#cb28-3" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> latch<span class="op">(</span><span class="dt">ptrdiff_t</span> expected<span class="op">)</span>;</span>
<span id="cb28-4"><a href="#cb28-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb28-5"><a href="#cb28-5" aria-hidden="true" tabindex="-1"></a><span class="kw">constexpr</span> <span class="kw">explicit</span> barrier<span class="op">(</span><span class="dt">ptrdiff_t</span> expected,</span>
<span id="cb28-6"><a href="#cb28-6" aria-hidden="true" tabindex="-1"></a>                           CompletionFunction f <span class="op">=</span> CompletionFunction<span class="op">())</span>;</span>
<span id="cb28-7"><a href="#cb28-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb28-8"><a href="#cb28-8" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> F<span class="op">&gt;</span></span>
<span id="cb28-9"><a href="#cb28-9" aria-hidden="true" tabindex="-1"></a>  <span class="kw">explicit</span> packaged_task<span class="op">(</span>F<span class="op">&amp;&amp;</span> f<span class="op">)</span>;</span></code></pre></div>
<h2 data-number="3.3" id="a-survey-of-the-status-quo-for-this-topic-in-the-wider-c-community."><span class="header-section-number">3.3</span> (3) A survey of the status quo
for this topic, in the wider C++ community.<a href="#a-survey-of-the-status-quo-for-this-topic-in-the-wider-c-community." class="self-link"></a></h2>
<p>I did not look at this in any depth. Anecdotally, it seems very
common to use <code class="sourceCode default">explicit</code> on
constructors and <code class="sourceCode default">bool</code> conversion
operators for disabling implicit conversions. I have rarely, if ever,
seen <code class="sourceCode default">explicit</code> used to force the
naming of a tag type at the point of construction outside of the
standard.</p>
<h1 data-number="4" id="proposal"><span class="header-section-number">4</span> Proposal<a href="#proposal" class="self-link"></a></h1>
<h2 data-number="4.1" id="a-clear-and-concise-definition-of-the-policy-proposed."><span class="header-section-number">4.1</span> (4) A clear and concise
definition of the policy proposed.<a href="#a-clear-and-concise-definition-of-the-policy-proposed." class="self-link"></a></h2>
<p>When proposing new templates and types for the standard library,
<code class="sourceCode default">explicit</code> should be used to
prevent unwanted implicit conversions, or to force the user to name a
type at the point of its use when constructing values of that type. In
particular, <code class="sourceCode default">explicit</code> should be
applied in the following circumstances.</p>
<ol type="1">
<li><p>Place <code class="sourceCode default">explicit</code> on
<code class="sourceCode default">bool</code> conversion operators,
e.g. <code class="sourceCode default">constexpr explicit operator bool() const;</code>.
Without this, the entire class type is convertible to
<code class="sourceCode default">bool</code>. Example:
<code class="sourceCode default">optional</code>’s
<code class="sourceCode default">bool</code> conversion operator is
<code class="sourceCode default">constexpr explicit operator bool() const noexcept</code>
(see [optional.observe]). This makes
<code class="sourceCode default">optional&lt;T&gt;</code> contextually
convertible to <code class="sourceCode default">bool</code>, but it
cannot directly be used to initialize a
<code class="sourceCode default">bool</code>.</p></li>
<li><p>Place <code class="sourceCode default">explicit</code> on
constructors that may take a single parameter (including when defaulted
parameters are not passed), when implicit conversion from that single
parameter is undesirable. Implicit conversions should exist only between
types that are fundamentally the same (such as
<code class="sourceCode default">float</code> and
<code class="sourceCode default">double</code>, but not a
<code class="sourceCode default">packaged_task</code> and some invocable
that may be used to construct it). Example: <code class="sourceCode default">constexpr explicit vector(size_type n, const Allocator&amp; = Allocator());</code>
(see [vector.cons]).</p></li>
<li><p>Place <code class="sourceCode default">explicit</code> on tag
types, to force the spelling of the tag type at the point of its
construction. Example:
<code class="sourceCode default">explicit unexpect_t() = default</code>,
which prevents using <code class="sourceCode default">unexpect_t</code>
by simply writing <code class="sourceCode default">{}</code> when
calling a function that takes an
<code class="sourceCode default">unexpect_t</code> at that argument
position.</p></li>
</ol>
<h2 data-number="4.2" id="proposed-changes-to-the-wording-of-sd-9."><span class="header-section-number">4.2</span> (6) Proposed changes to the
wording of SD-9.<a href="#proposed-changes-to-the-wording-of-sd-9." class="self-link"></a></h2>
<p>Append to “List of Standard Library Policies” section of SD-9:</p>
<ol start="24" type="A">
<li>(P3116) Place <code class="sourceCode default">explicit</code> on
<code class="sourceCode default">bool</code> conversion operators.</li>
</ol>
<p>X+1. (P3116) Place <code class="sourceCode default">explicit</code>
on constructors that may be called with a single argument, when implicit
conversion from that single argument is undesirable.</p>
<p>X+2. (P3116) Place <code class="sourceCode default">explicit</code>
on nullary constructors of tag types.</p>
<h1 data-number="5" id="bibliography"><span class="header-section-number">5</span> References<a href="#bibliography" class="self-link"></a></h1>
<div id="refs" class="references csl-bib-body hanging-indent" role="doc-bibliography">
<div id="ref-P1976R2" class="csl-entry" role="doc-biblioentry">
[P1976R2] Tomasz Kamiński. 2020-02-11. Fixed-size <span>“span”</span>
construction from dynamic-size range. <a href="https://wg21.link/p1976r2"><div class="csl-block">https://wg21.link/p1976r2</div></a>
</div>
<div id="ref-P2711R1" class="csl-entry" role="doc-biblioentry">
[P2711R1] Ville Voutilainen. 2022-11-12. Making multi-param constructors
of views explicit. <a href="https://wg21.link/p2711r1"><div class="csl-block">https://wg21.link/p2711r1</div></a>
</div>
</div>
</div>
</div>
</body>
</html>
