<!DOCTYPE html>

<html lang="en">

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="mobile-web-app-capable" content="yes">
    <title>
        non_invalidating_vector - HackMD
    </title>
    <link rel="icon" type="image/png" href="https://hackmd.io/favicon.png">
    <link rel="apple-touch-icon" href="https://hackmd.io/apple-touch-icon.png">

    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha256-916EbMg70RQy9LHiGkXzG8hSg9EdNy97GazNG/aiY1w=" crossorigin="anonymous" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ionicons/2.0.1/css/ionicons.min.css" integrity="sha256-3iu9jgsy9TpTwXKb7bNQzqWekRX7pPK+2OLj3R922fo=" crossorigin="anonymous" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/octicons/3.5.0/octicons.min.css" integrity="sha256-QiWfLIsCT02Sdwkogf6YMiQlj4NE84MKkzEMkZnMGdg=" crossorigin="anonymous" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.5.1/themes/prism.min.css" integrity="sha256-vtR0hSWRc3Tb26iuN2oZHt3KRUomwTufNIf5/4oeCyg=" crossorigin="anonymous" />
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@hackmd/emojify.js@2.1.0/dist/css/basic/emojify.min.css" integrity="sha256-UOrvMOsSDSrW6szVLe8ZDZezBxh5IoIfgTwdNDgTjiU=" crossorigin="anonymous" />
    <style>
        @import url(https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,500,500i|Source+Code+Pro:300,400,500|Source+Sans+Pro:300,300i,400,400i,600,600i|Source+Serif+Pro&subset=latin-ext);.hljs{background:#fff;color:#333;display:block;overflow-x:auto;padding:.5em}.hljs-comment,.hljs-meta{color:#969896}.hljs-emphasis,.hljs-quote,.hljs-string,.hljs-strong,.hljs-template-variable,.hljs-variable{color:#df5000}.hljs-keyword,.hljs-selector-tag,.hljs-type{color:#a71d5d}.hljs-attribute,.hljs-bullet,.hljs-literal,.hljs-number,.hljs-symbol{color:#0086b3}.hljs-built_in,.hljs-builtin-name{color:#005cc5}.hljs-name,.hljs-section{color:#63a35c}.hljs-tag{color:#333}.hljs-attr,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-title{color:#795da3}.hljs-addition{background-color:#eaffea;color:#55a532}.hljs-deletion{background-color:#ffecec;color:#bd2c00}.hljs-link{text-decoration:underline}.markdown-body{word-wrap:break-word;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:16px;line-height:1.5}.markdown-body:after,.markdown-body:before{content:"";display:table}.markdown-body:after{clear:both}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:#c00}.markdown-body .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.markdown-body .anchor:focus{outline:none}.markdown-body blockquote,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-bottom:16px;margin-top:0}.markdown-body hr{background-color:#e7e7e7;border:0;height:.25em;margin:24px 0;padding:0}.markdown-body blockquote{border-left:.25em solid #ddd;color:#777;font-size:16px;padding:0 1em}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body kbd,.popover kbd{background-color:#fcfcfc;border:1px solid;border-color:#ccc #ccc #bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb;color:#555;display:inline-block;font-size:11px;line-height:10px;padding:3px 5px;vertical-align:middle}.markdown-body .loweralpha{list-style-type:lower-alpha}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{font-weight:600;line-height:1.25;margin-bottom:16px;margin-top:24px}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#000;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 code,.markdown-body h1 tt,.markdown-body h2 code,.markdown-body h2 tt,.markdown-body h3 code,.markdown-body h3 tt,.markdown-body h4 code,.markdown-body h4 tt,.markdown-body h5 code,.markdown-body h5 tt,.markdown-body h6 code,.markdown-body h6 tt{font-size:inherit}.markdown-body h1{font-size:2em}.markdown-body h1,.markdown-body h2{border-bottom:1px solid #eee;padding-bottom:.3em}.markdown-body h2{font-size:1.5em}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:.875em}.markdown-body h6{color:#777;font-size:.85em}.markdown-body ol,.markdown-body ul{padding-left:2em}.markdown-body ol.no-list,.markdown-body ul.no-list{list-style-type:none;padding:0}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-bottom:0;margin-top:0}.markdown-body li>p{margin-top:16px}.markdown-body li+li{padding-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{font-size:1em;font-style:italic;font-weight:700;margin-top:16px;padding:0}.markdown-body dl dd{margin-bottom:16px;padding:0 16px}.markdown-body table{display:block;overflow:auto;width:100%;word-break:normal;word-break:keep-all}.markdown-body table th{font-weight:700}.markdown-body table td,.markdown-body table th{border:1px solid #ddd}.markdown-body table tr{background-color:#fff;border-top:1px solid #ccc}.markdown-body table tr:nth-child(2n){background-color:#f8f8f8}.markdown-body img{background-color:#fff;box-sizing:initial;max-width:100%}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{background-color:initial;max-width:none;vertical-align:text-top}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{border:1px solid #ddd;display:block;float:left;margin:13px 0 0;overflow:hidden;padding:7px;width:auto}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{clear:both;color:#333;display:block;padding:5px 0 0}.markdown-body span.align-center{clear:both;display:block;overflow:hidden}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{clear:both;display:block;overflow:hidden}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{background-color:#0000000a;border-radius:3px;font-size:85%;margin:0;padding:.2em 0}.markdown-body code:after,.markdown-body code:before,.markdown-body tt:after,.markdown-body tt:before{content:"\00a0";letter-spacing:-.2em}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body pre{word-wrap:normal}.markdown-body pre>code{background:#0000;border:0;font-size:100%;margin:0;padding:0;white-space:pre;word-break:normal}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{border-radius:3px;font-size:85%;line-height:1.45;overflow:auto}.markdown-body:not(.next-editor) pre{padding:16px}.markdown-body pre code,.markdown-body pre tt{word-wrap:normal;background-color:initial;border:0;display:inline;line-height:inherit;margin:0;max-width:auto;overflow:visible;padding:0}.markdown-body pre code:after,.markdown-body pre code:before,.markdown-body pre tt:after,.markdown-body pre tt:before{content:normal}.markdown-body .csv-data td,.markdown-body .csv-data th{font-size:12px;line-height:1;overflow:hidden;padding:5px;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-line-num{background:#fff;border:0;padding:10px 8px 9px;text-align:right}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{background:#f8f8f8;border-top:0;font-weight:700}.news .alert .markdown-body blockquote{border:0;padding:0 0 0 40px}.activity-tab .news .alert .commits,.activity-tab .news .markdown-body blockquote{padding-left:0}.task-list-item{list-style-type:none}.task-list-item label{font-weight:400}.task-list-item.enabled label{cursor:pointer}.task-list-item+.task-list-item{margin-top:3px}.task-list-item-checkbox{cursor:default!important;float:left;margin:.31em 0 .2em -1.3em!important;vertical-align:middle}.markdown-alert{border-left-style:solid;border-left-width:4px;color:inherit;margin-bottom:16px;padding:8px 16px}.markdown-alert .markdown-alert-title{align-items:center;display:flex;font-weight:500;line-height:1;white-space:break-spaces}.markdown-body .markdown-alert>*{margin-bottom:0;margin-top:16px}.markdown-body .markdown-alert .selection-popover,.markdown-body .markdown-alert>:first-child{margin-top:0}.markdown-alert.markdown-alert-note{border-left-color:#0969da}.markdown-alert.markdown-alert-note .markdown-alert-title{fill:currentColor;color:#0969da}.markdown-alert.markdown-alert-tip{border-left-color:#1a7f37}.markdown-alert.markdown-alert-tip .markdown-alert-title{fill:currentColor;color:#1a7f37}.markdown-alert.markdown-alert-important{border-left-color:#8250df}.markdown-alert.markdown-alert-important .markdown-alert-title{fill:currentColor;color:#8250df}.markdown-alert.markdown-alert-warning{border-left-color:#9a6700}.markdown-alert.markdown-alert-warning .markdown-alert-title{fill:currentColor;color:#9a6700}.markdown-alert.markdown-alert-caution{border-left-color:#d1242f}.markdown-alert.markdown-alert-caution .markdown-alert-title{fill:currentColor;color:#d1242f}:root[theme=dark] :not([theme])>*>.markdown-body,:root[theme] [theme=dark] .markdown-body{color:#f4f4f5}:root[theme=dark] :not([theme])>*>.markdown-body h1,:root[theme=dark] :not([theme])>*>.markdown-body h2,:root[theme] [theme=dark] .markdown-body h1,:root[theme] [theme=dark] .markdown-body h2{border-bottom-color:#52525b}:root[theme=dark] :not([theme])>*>.markdown-body h6,:root[theme] [theme=dark] .markdown-body h6{color:#a1a1aa}:root[theme=dark] :not([theme])>*>.markdown-body details,:root[theme] [theme=dark] .markdown-body details{background-color:#303036;color:#f4f4f5}:root[theme=dark] :not([theme])>*>.markdown-body details summary::marker:first-child,:root[theme] [theme=dark] .markdown-body details summary::marker:first-child{color:#f4f4f5}:root[theme=dark] :not([theme])>*>.markdown-body details:hover,:root[theme] [theme=dark] .markdown-body details:hover{background:#303036}:root[theme=dark] :not([theme])>*>.markdown-body details code,:root[theme=dark] :not([theme])>*>.markdown-body details[open]:hover,:root[theme] [theme=dark] .markdown-body details code,:root[theme] [theme=dark] .markdown-body details[open]:hover{background-color:#303036}:root[theme=dark] :not([theme])>*>.markdown-body hr,:root[theme] [theme=dark] .markdown-body hr{background-color:#52525b}:root[theme=dark] :not([theme])>*>.markdown-body blockquote,:root[theme] [theme=dark] .markdown-body blockquote{border-left-color:#71717a;color:#a1a1aa}:root[theme=dark] :not([theme])>*>.markdown-body blockquote a span,:root[theme] [theme=dark] .markdown-body blockquote a span{color:#9894f9}:root[theme=dark] :not([theme])>*>.markdown-body a.mention-anchor.user-card-popover,:root[theme] [theme=dark] .markdown-body a.mention-anchor.user-card-popover{background-color:#453aff26;color:#9894f9}:root[theme=dark] :not([theme])>*>.markdown-body ::selection,:root[theme] [theme=dark] .markdown-body ::selection{background-color:#453aff99}:root[theme=dark] :not([theme])>*>.markdown-body .alert.alert-info,:root[theme] [theme=dark] .markdown-body .alert.alert-info{background-color:#38bdf81a;border-left-color:#0ea5e9;color:#38bdf8}:root[theme=dark] :not([theme])>*>.markdown-body .alert.alert-warning,:root[theme] [theme=dark] .markdown-body .alert.alert-warning{background-color:#fbbf241a;border-left-color:#f59e0b;color:#f59e0b}:root[theme=dark] :not([theme])>*>.markdown-body .alert.alert-success,:root[theme] [theme=dark] .markdown-body .alert.alert-success{background-color:#6db19d26;border-left-color:#55b685;color:#6db19d}:root[theme=dark] :not([theme])>*>.markdown-body .alert.alert-danger,:root[theme] [theme=dark] .markdown-body .alert.alert-danger{background-color:#ef444433;border-left-color:#ef4444;color:#f87171}:root[theme=dark] :not([theme])>*>.markdown-body .mark,:root[theme=dark] :not([theme])>*>.markdown-body mark,:root[theme] [theme=dark] .markdown-body .mark,:root[theme] [theme=dark] .markdown-body mark{background-color:#fbbf241a;color:#f59e0b}:root[theme=dark] :not([theme])>*>.markdown-body .mark span,:root[theme=dark] :not([theme])>*>.markdown-body mark span,:root[theme] [theme=dark] .markdown-body .mark span,:root[theme] [theme=dark] .markdown-body mark span{color:#fbbf24}:root[theme=dark] :not([theme])>*>.markdown-body .highlight pre,:root[theme=dark] :not([theme])>*>.markdown-body pre,:root[theme] [theme=dark] .markdown-body .highlight pre,:root[theme] [theme=dark] .markdown-body pre{background-color:#303036;color:#a1a1aa}:root[theme=dark] :not([theme])>*>.markdown-body .style .token.string,:root[theme=dark] :not([theme])>*>.markdown-body .token.entity,:root[theme=dark] :not([theme])>*>.markdown-body .token.operator,:root[theme=dark] :not([theme])>*>.markdown-body .token.url,:root[theme=dark] :not([theme])>*>.markdown-body.language-css,:root[theme=dark] :not([theme])>*>.markdown-body.token.string,:root[theme] [theme=dark] .markdown-body .style .token.string,:root[theme] [theme=dark] .markdown-body .token.entity,:root[theme] [theme=dark] .markdown-body .token.operator,:root[theme] [theme=dark] .markdown-body .token.url,:root[theme] [theme=dark] .markdown-body.language-css,:root[theme] [theme=dark] .markdown-body.token.string{background:none}:root[theme=dark] :not([theme])>*>.markdown-body :not(pre)>code,:root[theme] [theme=dark] .markdown-body :not(pre)>code{background-color:#3f3f46}:root[theme=dark] :not([theme])>*>.markdown-body code .hljs-tag,:root[theme] [theme=dark] .markdown-body code .hljs-tag{color:#d4d4d8}:root[theme=dark] :not([theme])>*>.markdown-body code .hljs-keyword,:root[theme=dark] :not([theme])>*>.markdown-body code .hljs-selector-tag,:root[theme=dark] :not([theme])>*>.markdown-body code .hljs-type,:root[theme=dark] :not([theme])>*>.markdown-body code .token.boolean,:root[theme=dark] :not([theme])>*>.markdown-body code .token.constant,:root[theme=dark] :not([theme])>*>.markdown-body code .token.deleted,:root[theme=dark] :not([theme])>*>.markdown-body code .token.number,:root[theme=dark] :not([theme])>*>.markdown-body code .token.property,:root[theme=dark] :not([theme])>*>.markdown-body code .token.symbol,:root[theme=dark] :not([theme])>*>.markdown-body code .token.tag,:root[theme] [theme=dark] .markdown-body code .hljs-keyword,:root[theme] [theme=dark] .markdown-body code .hljs-selector-tag,:root[theme] [theme=dark] .markdown-body code .hljs-type,:root[theme] [theme=dark] .markdown-body code .token.boolean,:root[theme] [theme=dark] .markdown-body code .token.constant,:root[theme] [theme=dark] .markdown-body code .token.deleted,:root[theme] [theme=dark] .markdown-body code .token.number,:root[theme] [theme=dark] .markdown-body code .token.property,:root[theme] [theme=dark] .markdown-body code .token.symbol,:root[theme] [theme=dark] .markdown-body code .token.tag{color:#ff70b4}:root[theme=dark] :not([theme])>*>.markdown-body code .hljs-attribute,:root[theme=dark] :not([theme])>*>.markdown-body code .hljs-bullet,:root[theme=dark] :not([theme])>*>.markdown-body code .hljs-literal,:root[theme=dark] :not([theme])>*>.markdown-body code .hljs-number,:root[theme=dark] :not([theme])>*>.markdown-body code .hljs-symbol,:root[theme=dark] :not([theme])>*>.markdown-body code .token.atrule,:root[theme=dark] :not([theme])>*>.markdown-body code .token.attr-value,:root[theme=dark] :not([theme])>*>.markdown-body code .token.keyword,:root[theme] [theme=dark] .markdown-body code .hljs-attribute,:root[theme] [theme=dark] .markdown-body code .hljs-bullet,:root[theme] [theme=dark] .markdown-body code .hljs-literal,:root[theme] [theme=dark] .markdown-body code .hljs-number,:root[theme] [theme=dark] .markdown-body code .hljs-symbol,:root[theme] [theme=dark] .markdown-body code .token.atrule,:root[theme] [theme=dark] .markdown-body code .token.attr-value,:root[theme] [theme=dark] .markdown-body code .token.keyword{color:#9894f9}:root[theme=dark] :not([theme])>*>.markdown-body pre.part.plugin-rendered,:root[theme] [theme=dark] .markdown-body pre.part.plugin-rendered{background-color:#fff;color:#000}:root[theme=dark] :not([theme])>*>.markdown-body table,:root[theme] [theme=dark] .markdown-body table{border-color:#52525b}:root[theme=dark] :not([theme])>*>.markdown-body table thead tr,:root[theme] [theme=dark] .markdown-body table thead tr{background-color:#303036;border-bottom-color:#52525b}:root[theme=dark] :not([theme])>*>.markdown-body table td,:root[theme=dark] :not([theme])>*>.markdown-body table th,:root[theme] [theme=dark] .markdown-body table td,:root[theme] [theme=dark] .markdown-body table th{border-left-color:#52525b;border-top-color:#52525b}:root[theme=dark] :not([theme])>*>.markdown-body table tbody tr,:root[theme=dark] :not([theme])>*>.markdown-body table tr:nth-child(2n),:root[theme] [theme=dark] .markdown-body table tbody tr,:root[theme] [theme=dark] .markdown-body table tr:nth-child(2n){background-color:#27272a}:root[theme=light] :not([theme])>*>.markdown-body,:root[theme] [theme=light] .markdown-body{color:#3f3f46}:root[theme=light] :not([theme])>*>.markdown-body h1,:root[theme=light] :not([theme])>*>.markdown-body h2,:root[theme] [theme=light] .markdown-body h1,:root[theme] [theme=light] .markdown-body h2{border-bottom-color:#e4e4e7}:root[theme=light] :not([theme])>*>.markdown-body h6,:root[theme] [theme=light] .markdown-body h6{color:#71717a}:root[theme=light] :not([theme])>*>.markdown-body iframe,:root[theme] [theme=light] .markdown-body iframe{border:1px solid #e4e4e7;box-sizing:border-box}:root[theme=light] :not([theme])>*>.markdown-body details,:root[theme] [theme=light] .markdown-body details{background-color:#f4f4f5}:root[theme=light] :not([theme])>*>.markdown-body details:hover,:root[theme] [theme=light] .markdown-body details:hover{background:#e4e4e7}:root[theme=light] :not([theme])>*>.markdown-body details[open]:hover,:root[theme] [theme=light] .markdown-body details[open]:hover{background-color:#f4f4f5}:root[theme=light] :not([theme])>*>.markdown-body details code,:root[theme] [theme=light] .markdown-body details code{background-color:#e4e4e7}:root[theme=light] :not([theme])>*>.markdown-body hr,:root[theme] [theme=light] .markdown-body hr{background-color:#d4d4d8}:root[theme=light] :not([theme])>*>.markdown-body blockquote,:root[theme] [theme=light] .markdown-body blockquote{border-left-color:#e4e4e7;color:#71717a}:root[theme=light] :not([theme])>*>.markdown-body blockquote a span,:root[theme] [theme=light] .markdown-body blockquote a span{color:#453aff}:root[theme=light] :not([theme])>*>.markdown-body a.mention-anchor.user-card-popover,:root[theme] [theme=light] .markdown-body a.mention-anchor.user-card-popover{background-color:#ecebfe;color:#453aff}:root[theme=light] :not([theme])>*>.markdown-body ::selection,:root[theme] [theme=light] .markdown-body ::selection{background-color:#cccafc}:root[theme=light] :not([theme])>*>.markdown-body .alert.alert-info,:root[theme] [theme=light] .markdown-body .alert.alert-info{background-color:#e0f2fe;border-left-color:#0284c7;color:#0284c7}:root[theme=light] :not([theme])>*>.markdown-body .alert.alert-warning,:root[theme] [theme=light] .markdown-body .alert.alert-warning{background-color:#fef3c799;border-left-color:#f59e0b;color:#f59e0b}:root[theme=light] :not([theme])>*>.markdown-body .alert.alert-success,:root[theme] [theme=light] .markdown-body .alert.alert-success{background-color:#d9f9e5;border-left-color:#43946c;color:#43946c}:root[theme=light] :not([theme])>*>.markdown-body .alert.alert-danger,:root[theme] [theme=light] .markdown-body .alert.alert-danger{background-color:#fee2e299;border-left-color:#ef4444;color:#ef4444}:root[theme=light] :not([theme])>*>.markdown-body .mark,:root[theme=light] :not([theme])>*>.markdown-body mark,:root[theme] [theme=light] .markdown-body .mark,:root[theme] [theme=light] .markdown-body mark{background-color:#fef3c799;color:#f59e0b}:root[theme=light] :not([theme])>*>.markdown-body .mark span,:root[theme=light] :not([theme])>*>.markdown-body mark span,:root[theme] [theme=light] .markdown-body .mark span,:root[theme] [theme=light] .markdown-body mark span{color:#f59e0b}:root[theme=light] :not([theme])>*>.markdown-body .highlight pre,:root[theme=light] :not([theme])>*>.markdown-body pre,:root[theme] [theme=light] .markdown-body .highlight pre,:root[theme] [theme=light] .markdown-body pre{background-color:#f4f4f5}:root[theme=light] :not([theme])>*>.markdown-body pre.part.plugin-rendered,:root[theme] [theme=light] .markdown-body pre.part.plugin-rendered{background-color:inherit;color:inherit}:root[theme=light] :not([theme])>*>.markdown-body :not(pre)>code,:root[theme] [theme=light] .markdown-body :not(pre)>code{background-color:#0000000a}:root[theme=light] :not([theme])>*>.markdown-body table,:root[theme] [theme=light] .markdown-body table{border-color:#e4e4e7}:root[theme=light] :not([theme])>*>.markdown-body table thead tr,:root[theme] [theme=light] .markdown-body table thead tr{background-color:#f4f4f5;border-bottom-color:#d4d4d8}:root[theme=light] :not([theme])>*>.markdown-body table td,:root[theme=light] :not([theme])>*>.markdown-body table th,:root[theme] [theme=light] .markdown-body table td,:root[theme] [theme=light] .markdown-body table th{border-left-color:#e4e4e7;border-top-color:#e4e4e7}:root[theme=light] :not([theme])>*>.markdown-body table tbody tr,:root[theme=light] :not([theme])>*>.markdown-body table tr:nth-child(2n),:root[theme] [theme=light] .markdown-body table tbody tr,:root[theme] [theme=light] .markdown-body table tr:nth-child(2n){background-color:#fdfdfd}.markdown-body{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;max-width:758px;overflow:visible!important;padding-bottom:40px;padding-top:40px;position:relative}.markdown-body>*{max-width:100%;overflow:auto}.markdown-body .alert a,.markdown-body a{color:var(--hmd-tw-link-text-default)}.markdown-body .alert a:focus,.markdown-body .alert a:hover,.markdown-body a:focus,.markdown-body a:hover{color:var(--hmd-tw-link-text-hover)}.markdown-body .alert a:hover,.markdown-body a:hover{text-decoration-thickness:2px;text-underline-offset:4px}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5{font-family:Readex Pro,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-weight:700}.markdown-body h1,.markdown-body h2{border-bottom:1px solid}.markdown-body iframe,.markdown-body img{background-color:initial;border-radius:6px;margin:.5rem 0}.markdown-body iframe{max-width:100%;width:728px}.markdown-body details{border-radius:4px;margin-bottom:.5rem;padding:.5rem 1rem}.markdown-body details:hover{transition:all .1s}.markdown-body details summary+p{margin-top:.5rem}.markdown-body details p:last-child{margin-bottom:0}.markdown-body hr{height:2px}.markdown-body img.emoji{border:none;height:20px;vertical-align:middle;width:20px}.markdown-body li small{color:#a1a1aa}.markdown-body blockquote{border-left:3px solid}.markdown-body blockquote .small,.markdown-body blockquote small,.markdown-body li small{display:initial;font-size:85%}.markdown-body a.mention-anchor:before{content:"";margin-right:0}.markdown-body a.mention-anchor.user-card-popover{border-radius:4px;padding:1px 4px}.markdown-body .alert{border:none;border-radius:4px;margin-top:10px}.markdown-body .alert h2,.markdown-body .alert h3,.markdown-body .alert h4,.markdown-body .alert h5,.markdown-body .alert h6{margin-top:0}.markdown-body .alert h2{border:none}.markdown-body .alert.alert-danger,.markdown-body .alert.alert-info,.markdown-body .alert.alert-success,.markdown-body .alert.alert-warning{border-left:3px solid}.markdown-body .highlight pre,.markdown-body .mark,.markdown-body mark,.markdown-body pre{border-radius:4px}.markdown-body pre.part.abc,.markdown-body pre.part.flow-chart,.markdown-body pre.part.fretboard,.markdown-body pre.part.graphviz,.markdown-body pre.part.mermaid,.markdown-body pre.part.sequence-diagram,.markdown-body pre.part.vega-embed{border-radius:4px;max-width:100%;overflow:auto}.markdown-body table{border:1px solid;border-radius:4px;width:fit-content}.markdown-body table thead tr{border-bottom:1px solid;border-top:none}.markdown-body table tbody tr,.markdown-body table thead tr th{border-top:none}.markdown-body table tbody tr td:first-child,.markdown-body table thead,.markdown-body table thead th:first-child{border-left:none}.markdown-body table td,.markdown-body table th{border:1px solid;border-bottom:none;border-right:none;padding:6px 13px}.markdown-body.next-editor{overflow-x:hidden!important}.markdown-body pre{border:inherit}.markdown-body code{color:inherit}html[lang^=ja] .markdown-body code code,html[lang^=ja] .markdown-body code kbd,html[lang^=ja] .markdown-body code pre{font-family:Source Code Pro,Consolas,monaco,Meiryo,ＭＳ ゴシック,MS Gothic,monospace}html[lang=zh-tw] .markdown-body code code,html[lang=zh-tw] .markdown-body code kbd,html[lang=zh-tw] .markdown-body code pre{font-family:Source Code Pro,Consolas,monaco,Microsoft JhengHei,微軟正黑,monospace}html[lang=zh-cn] .markdown-body code code,html[lang=zh-cn] .markdown-body code kbd,html[lang=zh-cn] .markdown-body code pre{font-family:Source Code Pro,Consolas,monaco,Microsoft YaHei,微软雅黑,monospace}html .markdown-body code[lang^=ja] code,html .markdown-body code[lang^=ja] kbd,html .markdown-body code[lang^=ja] pre{font-family:Source Code Pro,Consolas,monaco,Meiryo,ＭＳ ゴシック,MS Gothic,monospace}html .markdown-body code[lang=zh-tw] code,html .markdown-body code[lang=zh-tw] kbd,html .markdown-body code[lang=zh-tw] pre{font-family:Source Code Pro,Consolas,monaco,Microsoft JhengHei,微軟正黑,monospace}html .markdown-body code[lang=zh-cn] code,html .markdown-body code[lang=zh-cn] kbd,html .markdown-body code[lang=zh-cn] pre{font-family:Source Code Pro,Consolas,monaco,Microsoft YaHei,微软雅黑,monospace}.markdown-body pre code .wrapper{display:-moz-inline-flex;display:-ms-inline-flex;display:-o-inline-flex;display:inline-flex}.markdown-body pre code .gutter{float:left;overflow:hidden;-webkit-user-select:none;user-select:none}.markdown-body pre code .gutter.linenumber{border-right:2px solid #766df8;box-sizing:initial;color:#a1a1aa;cursor:default;display:inline-block;min-width:20px;padding:0 8px 0 0;position:relative;text-align:right;z-index:4}.markdown-body pre code .gutter.linenumber>span:before{content:attr(data-linenumber)}.markdown-body pre code .code{float:left;margin:0 0 0 16px}.markdown-body .gist .line-numbers{border-bottom:none;border-left:none;border-top:none}.markdown-body .gist .line-data{border:none}.markdown-body .gist table{border-collapse:inherit!important;border-spacing:0}.markdown-body code[data-gist-id]{background:none;padding:0}.markdown-body code[data-gist-id]:after,.markdown-body code[data-gist-id]:before{content:""}.markdown-body code[data-gist-id] .blob-num{border:unset}.markdown-body code[data-gist-id] table{margin-bottom:unset;overflow:unset}.markdown-body code[data-gist-id] table tr{background:unset}.markdown-body[dir=rtl] pre{direction:ltr}.markdown-body[dir=rtl] code{direction:ltr;unicode-bidi:embed}.markdown-body .alert{display:flex;flex-direction:column;gap:16px}.markdown-body .alert>*{margin:0}.markdown-body pre.abc,.markdown-body pre.flow-chart,.markdown-body pre.graphviz,.markdown-body pre.mermaid,.markdown-body pre.sequence-diagram,.markdown-body pre.vega{background-color:inherit;border-radius:0;overflow:visible;text-align:center;white-space:inherit}.markdown-body pre.abc>code,.markdown-body pre.flow-chart>code,.markdown-body pre.graphviz>code,.markdown-body pre.mermaid>code,.markdown-body pre.sequence-diagram>code,.markdown-body pre.vega>code{text-align:left}.markdown-body pre.abc>svg,.markdown-body pre.flow-chart>svg,.markdown-body pre.graphviz>svg,.markdown-body pre.mermaid>svg,.markdown-body pre.sequence-diagram>svg,.markdown-body pre.vega>svg{height:100%;max-width:100%}.markdown-body pre>code.wrap{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap}.markdown-body pre.pseudocode{white-space-collapse:collapse}.markdown-body summary{display:list-item}.markdown-body summary:focus{outline:none}.markdown-body details summary{cursor:pointer}.markdown-body details:not([open])>:not(summary){display:none}.markdown-body figure{margin:1em 40px}.markdown-body .mark,.markdown-body mark{background-color:#fff1a7}:root[theme] .markdown-body ::marker,:root[theme] .markdown-body code{color:var(--hmd-tw-text-default)}:root[theme] .markdown-body h1,:root[theme] .markdown-body h2,:root[theme] .markdown-body h3,:root[theme] .markdown-body h4,:root[theme] .markdown-body h5,:root[theme] .markdown-body h6{overflow:visible}:root[theme] .markdown-body h1 .octicon-link,:root[theme] .markdown-body h2 .octicon-link,:root[theme] .markdown-body h3 .octicon-link,:root[theme] .markdown-body h4 .octicon-link,:root[theme] .markdown-body h5 .octicon-link,:root[theme] .markdown-body h6 .octicon-link{color:var(--hmd-tw-text-subtle)}:root[theme] .markdown-body .anchor{left:0;margin-left:0;position:absolute}:root[theme] .markdown-body .gist table{border-color:inherit}:root[theme] .markdown-body .gist table thead tr{background-color:inherit;border-bottom-color:inherit}:root[theme] .markdown-body .gist table td,:root[theme] .markdown-body .gist table th{border-left-color:inherit;border-top-color:inherit}:root[theme] .markdown-body .gist table tbody tr,:root[theme] .markdown-body .gist table tr:nth-child(2n){background-color:inherit}@media (max-width:767px){.markdown-body h1{font-size:1.6em}.markdown-body h2{font-size:1.4em}.markdown-body h3{font-size:1.125em}}.vimeo,.youtube{background-color:#000;background-position:50%;background-repeat:no-repeat;background-size:contain;cursor:pointer;display:table;overflow:hidden;text-align:center}.vimeo,.youtube{position:relative;width:100%}.youtube{padding-bottom:56.25%}.vimeo img{object-fit:contain;width:100%;z-index:0}.youtube img{object-fit:cover;z-index:0}.vimeo iframe,.youtube iframe,.youtube img{height:100%;left:0;position:absolute;top:0;width:100%}.vimeo iframe,.youtube iframe{vertical-align:middle;z-index:1}.vimeo .icon,.youtube .icon{color:#fff;height:auto;left:50%;opacity:.3;position:absolute;top:50%;transform:translate(-50%,-50%);transition:opacity .2s;width:auto;z-index:0}.vimeo:hover .icon,.youtube:hover .icon{opacity:.6;transition:opacity .2s}.slideshare .inner,.speakerdeck .inner{position:relative;width:100%}.slideshare .inner iframe,.speakerdeck .inner iframe{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}.figma{display:table;padding-bottom:56.25%;position:relative;width:100%}.figma iframe{border:1px solid #eee;bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}.markmap-container{height:300px}.markmap-container>svg{height:100%;width:100%}.MJX_Assistive_MathML{display:none}#MathJax_Message{z-index:1000!important}.ui-infobar{color:var(--hmd-tw-text-default);font-size:14px;margin:25px auto -25px;max-width:760px;position:relative;z-index:2}.ui-infobar .ui-user-icon.small{height:18px;margin:2px;vertical-align:top;width:18px}.toc .invisable-node{list-style-type:none}.ui-toc{bottom:20px;position:fixed;z-index:998}.ui-toc.both-mode{margin-left:2px}.ui-toc.both-mode .ui-toc-label{border-bottom-left-radius:0;border-top-left-radius:0;height:40px;padding:10px 4px}:root[theme=light] :not([theme])>*>.ui-toc .ui-toc-label,:root[theme] [theme=light] .ui-toc-label{background-color:#fdfdfd;border-color:#d4d4d8;color:#a1a1aa}:root[theme=light] :not([theme])>*>.ui-toc .ui-toc-label:active,:root[theme=light] :not([theme])>*>.ui-toc .ui-toc-label:hover,:root[theme] [theme=light] .ui-toc-label:active,:root[theme] [theme=light] .ui-toc-label:hover{background-color:#f4f4f5;border-color:#d4d4d8;color:#a1a1aa}:root[theme=dark] :not([theme])>*>.ui-toc .ui-toc-label,:root[theme=dark] :not([theme])>*>.ui-toc .ui-toc-label:active,:root[theme=dark] :not([theme])>*>.ui-toc .ui-toc-label:hover,:root[theme] [theme=dark] .ui-toc-label,:root[theme] [theme=dark] .ui-toc-label:active,:root[theme] [theme=dark] .ui-toc-label:hover{background-color:#303036;border-color:#52525b;color:#a1a1aa}:root[theme=dark] :not([theme])>*>.ui-toc.both-mode .ui-toc-label,:root[theme] [theme=dark] .ui-toc.both-mode .ui-toc-label{background-color:#303036;border-color:#3f3f46;color:#d4d4d8}:root[theme=dark] :not([theme])>*>.ui-toc.both-mode .ui-toc-label:hover,:root[theme] [theme=dark] .ui-toc.both-mode .ui-toc-label:hover{background-color:#52525b}.ui-toc-label{border:1px solid;transition:opacity .2s}.ui-toc .open .ui-toc-label,.ui-toc-label:hover{opacity:1;transition:opacity .2s}.ui-toc-dropdown{letter-spacing:normal;margin-bottom:20px;margin-top:20px;max-height:70vh;max-width:45vw;overflow:auto;padding-left:10px;padding-right:10px;text-align:inherit;width:25vw}.ui-toc-dropdown.dropdown-menu{box-shadow:0 3px 15px 0 #00000026}.ui-toc-dropdown>.toc{max-height:calc(70vh - 100px);overflow:auto}.ui-toc-dropdown[dir=rtl] .nav{letter-spacing:.0029em;padding-right:0}.ui-toc-dropdown a{overflow:hidden;text-overflow:ellipsis;white-space:pre}.ui-toc-dropdown .nav>li>a{color:var(--hmd-tw-text-subtle);display:block;font-size:12px;font-weight:500;line-height:16px;padding:4px 20px}.ui-toc-dropdown .nav>li:first-child:last-child>ul,.ui-toc-dropdown .toc.expand ul{display:block}.ui-toc-dropdown .nav>li>a:focus,.ui-toc-dropdown .nav>li>a:hover{background-color:initial;border-color:var(--hmd-tw-border-bold);border-style:solid;border-width:0 0 0 1px;color:#000;color:var(--hmd-tw-text-emphasize);padding-left:19px;text-decoration:none}.ui-toc-dropdown[dir=rtl] .nav>li>a:focus,.ui-toc-dropdown[dir=rtl] .nav>li>a:hover{border-left:none;border-right:1px solid #000;padding-right:19px}.ui-toc-dropdown .nav>.active:focus>a,.ui-toc-dropdown .nav>.active:hover>a,.ui-toc-dropdown .nav>.active>a{background-color:initial;border-color:var(--hmd-tw-border-bold);border-style:solid;border-width:0 0 0 2px;color:var(--hmd-tw-text-emphasize);font-weight:600;padding-left:18px}.ui-toc-dropdown[dir=rtl] .nav>.active:focus>a,.ui-toc-dropdown[dir=rtl] .nav>.active:hover>a,.ui-toc-dropdown[dir=rtl] .nav>.active>a{border-width:0 2px 0 medium;border-left:0;border-color:var(--hmd-tw-border-bold);border-style:solid;padding-right:18px}.ui-toc-dropdown .nav .nav{display:none;padding-bottom:10px}.ui-toc-dropdown .nav>.active>ul{display:block}.ui-toc-dropdown .nav .nav>li>a{font-size:12px;font-weight:400;padding-bottom:1px;padding-left:30px;padding-top:1px}.ui-toc-dropdown[dir=rtl] .nav .nav>li>a{padding-right:30px}.ui-toc-dropdown .nav .nav>li>ul>li>a{font-size:12px;font-weight:400;padding-bottom:1px;padding-left:40px;padding-top:1px}.ui-toc-dropdown[dir=rtl] .nav .nav>li>ul>li>a{padding-right:40px}.ui-toc-dropdown .nav .nav>li>a:focus,.ui-toc-dropdown .nav .nav>li>a:hover{padding-left:29px}.ui-toc-dropdown[dir=rtl] .nav .nav>li>a:focus,.ui-toc-dropdown[dir=rtl] .nav .nav>li>a:hover{padding-right:29px}.ui-toc-dropdown .nav .nav>li>ul>li>a:focus,.ui-toc-dropdown .nav .nav>li>ul>li>a:hover{padding-left:39px}.ui-toc-dropdown[dir=rtl] .nav .nav>li>ul>li>a:focus,.ui-toc-dropdown[dir=rtl] .nav .nav>li>ul>li>a:hover{padding-right:39px}.ui-toc-dropdown .nav .nav>.active:focus>a,.ui-toc-dropdown .nav .nav>.active:hover>a,.ui-toc-dropdown .nav .nav>.active>a{font-weight:500;padding-left:28px}.ui-toc-dropdown[dir=rtl] .nav .nav>.active:focus>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active:hover>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active>a{padding-right:28px}.ui-toc-dropdown .nav .nav>.active>.nav>.active:focus>a,.ui-toc-dropdown .nav .nav>.active>.nav>.active:hover>a,.ui-toc-dropdown .nav .nav>.active>.nav>.active>a{font-weight:500;padding-left:38px}.ui-toc-dropdown[dir=rtl] .nav .nav>.active>.nav>.active:focus>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active>.nav>.active:hover>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active>.nav>.active>a{padding-right:38px}.ui-affix-toc{max-height:70vh;max-width:15vw;overflow:auto;position:fixed;top:0}.back-to-top,.expand-toggle,.go-to-bottom{color:var(--hmd-tw-text-subtle);display:block;font-size:12px;font-weight:500;line-height:16px;margin-left:10px;margin-top:10px;padding:2px 10px}.back-to-top:focus,.back-to-top:hover,.expand-toggle:focus,.expand-toggle:hover,.go-to-bottom:focus,.go-to-bottom:hover{color:var(--hmd-tw-text-primary);text-decoration:none}.back-to-top,.go-to-bottom{margin-top:0}.ui-user-icon{background-position:50%;background-repeat:no-repeat;background-size:cover;border-radius:50%;display:block;height:20px;margin-bottom:2px;margin-right:5px;margin-top:2px;width:20px}.ui-user-icon.small{display:inline-block;height:18px;margin:0 0 .2em;vertical-align:middle;width:18px}.ui-infobar>small>span{line-height:22px}.ui-infobar>small .dropdown{display:inline-block}.ui-infobar>small .dropdown a:focus,.ui-infobar>small .dropdown a:hover{text-decoration:none}.ui-more-info{cursor:pointer;vertical-align:middle}.ui-connectedGithub{line-height:23px;white-space:nowrap}.ui-connectedGithub a.file-path{text-decoration:none}.ui-connectedGithub a.file-path:active,.ui-connectedGithub a.file-path:hover{text-decoration:underline}.unselectable{-webkit-user-select:none;-o-user-select:none;user-select:none}.selectable{-webkit-user-select:text;-o-user-select:text;user-select:text}.inline-spoiler-section{cursor:pointer}.inline-spoiler-section .spoiler-text{background-color:#333;border-radius:2px}.inline-spoiler-section .spoiler-text>*{opacity:0}.inline-spoiler-section .spoiler-img{filter:blur(10px)}.inline-spoiler-section.raw{background-color:#333;border-radius:2px}.inline-spoiler-section.raw>*{opacity:0}.inline-spoiler-section.unveil{cursor:auto}.inline-spoiler-section.unveil .spoiler-text{background-color:#3333331a}.inline-spoiler-section.unveil .spoiler-text>*{opacity:1}.inline-spoiler-section.unveil .spoiler-img{filter:none}@media print{blockquote,div,img,pre,table{page-break-inside:avoid!important}a[href]:after{font-size:12px!important}}.markdown-body.slides{color:#222;position:relative;z-index:1}.markdown-body.slides:before{background-color:currentColor;bottom:0;box-shadow:0 0 0 50vw;content:"";display:block;left:0;position:absolute;right:0;top:0;z-index:-1}.markdown-body.slides section[data-markdown]{background-color:#fff;margin-bottom:1.5em;position:relative;text-align:center}.markdown-body.slides section[data-markdown] code{text-align:left}.markdown-body.slides section[data-markdown]:before{content:"";display:block;padding-bottom:56.23%}.markdown-body.slides section[data-markdown]>div:first-child{left:1em;max-height:100%;overflow:hidden;position:absolute;right:1em;top:50%;transform:translateY(-50%)}.markdown-body.slides section[data-markdown]>ul{display:inline-block}.markdown-body.slides>section>section+section:after{border:3px solid #777;content:"";height:1.5em;position:absolute;right:1em;top:-1.5em}.site-ui-font{font-family:Source Sans Pro,Helvetica,Arial,sans-serif}html[lang^=ja] .site-ui-font{font-family:Source Sans Pro,Helvetica,Arial,Hiragino Kaku Gothic Pro,ヒラギノ角ゴ Pro W3,Osaka,Meiryo,メイリオ,MS Gothic,ＭＳ ゴシック,sans-serif}html[lang=zh-tw] .site-ui-font{font-family:Source Sans Pro,Helvetica,Arial,PingFang TC,Microsoft JhengHei,微軟正黑,sans-serif}html[lang=zh-cn] .site-ui-font{font-family:Source Sans Pro,Helvetica,Arial,PingFang SC,Microsoft YaHei,微软雅黑,sans-serif}body{font-smoothing:subpixel-antialiased!important;-webkit-font-smoothing:subpixel-antialiased!important;-moz-osx-font-smoothing:auto!important;-webkit-overflow-scrolling:touch;font-family:Source Sans Pro,Helvetica,Arial,sans-serif;letter-spacing:.025em}html[lang^=ja] body{font-family:Source Sans Pro,Helvetica,Arial,Hiragino Kaku Gothic Pro,ヒラギノ角ゴ Pro W3,Osaka,Meiryo,メイリオ,MS Gothic,ＭＳ ゴシック,sans-serif}html[lang=zh-tw] body{font-family:Source Sans Pro,Helvetica,Arial,PingFang TC,Microsoft JhengHei,微軟正黑,sans-serif}html[lang=zh-cn] body{font-family:Source Sans Pro,Helvetica,Arial,PingFang SC,Microsoft YaHei,微软雅黑,sans-serif}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}abbr[data-original-title],abbr[title]{cursor:help}body.modal-open{overflow-y:auto;padding-right:0!important}svg{text-shadow:none}
    </style>
    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
    	<script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js" integrity="sha256-3Jy/GbSLrg0o9y5Z5n1uw0qxZECH7C6OQpVBgNFYa0g=" crossorigin="anonymous"></script>
    	<script src="https://cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js" integrity="sha256-g6iAfvZp+nDQ2TdTR/VVKJf3bGro4ub5fvWSWVRi2NE=" crossorigin="anonymous"></script>
		<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.9/es5-shim.min.js" integrity="sha256-8E4Is26QH0bD52WoQpcB+R/tcWQtpzlCojrybUd7Mxo=" crossorigin="anonymous"></script>
    <![endif]-->
</head>

<body>
    <div id="doc" class="markdown-body container-fluid comment-enabled" data-hard-breaks="false"><style data-custom-style="">
ins { background-color: #CCFFCC }
s { background-color: #FFCACA }
blockquote { color: inherit !important }
</style><table>
<tbody><tr>
<td>Document number</td>
<td>P3356R0</td>
</tr>
<tr>
<td>Date</td>
<td>2024-07-13</td>
</tr>
<tr>
<td>Reply-to</td>
<td>
<p><span>Jarrad J. Waterloo &lt;descender76 at gmail dot com&gt;</span></p>
</td>
</tr>
<tr>
<td>Audience</td>
<td>Library Evolution Working Group (LEWG)</td>
</tr>
</tbody></table><h1 id="non_invalidating_vector" data-id="non_invalidating_vector" data-original-title="" title=""><a class="anchor hidden-xs" href="#non_invalidating_vector" title="non_invalidating_vector"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>non_invalidating_vector</span></h1><style data-custom-style="">
.inline-link
{
    font-size: small;
    margin-top: -2.8em;
    margin-right: 4px;
    text-align: right;
    font-weight: bold;
}

code
{
    font-family: "Fira Code", monospace !important;
    font-size: 0.87em;
}

.sourceCode
{
    font-size: 0.95em;
}

a code
{
    color: #0645ad;
}
</style><h2 id="Table-of-contents" data-id="Table-of-contents"><a class="anchor hidden-xs" href="#Table-of-contents" title="Table-of-contents"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>Table of contents</span></h2><ul>
<li><a href="#non_invalidating_vector"><span>non_invalidating_vector</span></a>
<ul>
<li><a href="#Abstract"><span>Abstract</span></a></li>
<li><a href="#Motivational-Example"><span>Motivational Example</span></a></li>
<li><a href="#Prior-Work"><span>Prior Work</span></a></li>
<li><a href="#Potential-Improvements"><span>Potential Improvements</span></a></li>
<li><a href="#Alternative"><span>Alternative</span></a></li>
<li><a href="#Wording"><span>Wording</span></a></li>
<li><a href="#Alternate-Wording"><span>Alternate Wording</span></a></li>
<li><a href="#Impact-on-the-standard"><span>Impact on the standard</span></a></li>
<li><a href="#Implementation"><span>Implementation</span></a></li>
<li><a href="#References"><span>References</span></a></li>
</ul>
</li>
</ul><h2 id="Abstract" data-id="Abstract"><a class="anchor hidden-xs" href="#Abstract" title="Abstract"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>Abstract</span></h2><p><span>Add a non invalidating vector and a non invalidating reference of </span><code>std::vector</code><span> to the standard template library in order to make it easier for programmers to proactively manage their invalidation safety concerns.</span></p><h2 id="Motivational-Example" data-id="Motivational-Example"><a class="anchor hidden-xs" href="#Motivational-Example" title="Motivational-Example"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>Motivational Example</span></h2><pre><code class="cpp hljs"><span class="token keyword">void</span> <span class="token function">non_invalidating</span><span class="token punctuation">(</span>non_invalidating_vector_ref<span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token operator">&gt;</span> niv<span class="token punctuation">,</span> <span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token operator">&gt;</span><span class="token operator">&amp;</span> cv<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token comment">// no worry of niv invalidating</span>
    <span class="token comment">// no worry of cv invalidating</span>
<span class="token punctuation">}</span>

<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token operator">&gt;</span> vs<span class="token punctuation">;</span>
    non_invalidating_vector<span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token operator">&gt;</span> niv<span class="token punctuation">;</span><span class="token comment">// free of invalidation concerns</span>
    <span class="token function">non_invalidating</span><span class="token punctuation">(</span>vs<span class="token punctuation">,</span> vs<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">non_invalidating</span><span class="token punctuation">(</span>niv<span class="token punctuation">,</span> vs<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span>non_invalidating_vector_ref<span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token operator">&gt;</span> vs<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token comment">// no worry of vs invalidating</span>
    <span class="token punctuation">}</span><span class="token punctuation">(</span>vs<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">auto</span> <span class="token operator">&amp;</span>s <span class="token operator">:</span> vs<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span>non_invalidating_vector_ref<span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token operator">&gt;</span> vs<span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token comment">// no worry of vs invalidating</span>
        <span class="token punctuation">}</span><span class="token punctuation">(</span>vs<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><h3 id="non_invalidating_vector_ref" data-id="non_invalidating_vector_ref"><a class="anchor hidden-xs" href="#non_invalidating_vector_ref" title="non_invalidating_vector_ref"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>non_invalidating_vector_ref</span></h3><p><code>non_invalidating_vector_ref</code><span> is just a pure reference to a </span><code>std::vector</code><span> that allow the programmer to call all of the non invalidating [member] functions and deletes all of the invalidating [member] functions. It also can be narrowed to </span><code>const std::vector&amp;</code><span> which is even more restricted. It's primarily meant to be used as parameters but like lvalue references in general can be used in a similar manner.</span></p><pre><code class="cpp hljs"><span class="token keyword">template</span><span class="token operator">&lt;</span>
    <span class="token keyword">class</span> <span class="token class-name">T</span><span class="token punctuation">,</span>
    <span class="token keyword">class</span> <span class="token class-name">Allocator</span> <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>allocator<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span>
<span class="token operator">&gt;</span>
<span class="token keyword">class</span> <span class="token class-name">non_invalidating_vector_ref</span>
<span class="token punctuation">{</span>
<span class="token keyword">private</span><span class="token operator">:</span>
    actual_type<span class="token operator">&amp;</span> ref<span class="token punctuation">;</span>
<span class="token keyword">public</span><span class="token operator">:</span>
    <span class="token comment">// constructors reflect this being just a pure reference type</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector_ref</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector_ref</span><span class="token punctuation">(</span><span class="token keyword">const</span> non_invalidating_vector_ref<span class="token operator">&amp;</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">default</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector_ref</span><span class="token punctuation">(</span>non_invalidating_vector_ref<span class="token operator">&amp;&amp;</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">default</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> non_invalidating_vector_ref <span class="token keyword">operator</span><span class="token operator">=</span><span class="token punctuation">(</span><span class="token keyword">const</span> non_invalidating_vector_ref<span class="token operator">&amp;</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> non_invalidating_vector_ref <span class="token keyword">operator</span><span class="token operator">=</span><span class="token punctuation">(</span><span class="token keyword">const</span> non_invalidating_vector_ref<span class="token operator">&amp;&amp;</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>

    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector_ref</span><span class="token punctuation">(</span>actual_type<span class="token operator">&amp;</span> reference<span class="token punctuation">)</span> <span class="token operator">:</span> ref<span class="token punctuation">{</span>reference<span class="token punctuation">}</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
    <span class="token comment">// all non invalidating methods are proxied</span>
    <span class="token keyword">constexpr</span> reference <span class="token keyword">operator</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span> size_type pos <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">[</span>pos<span class="token punctuation">]</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_reference <span class="token keyword">operator</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span> size_type pos <span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">[</span>pos<span class="token punctuation">]</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> size_type <span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">// all invalidating methods are deleted</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">resize</span><span class="token punctuation">(</span> size_type count <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token comment">// can narrow scope to just the const members</span>
    <span class="token keyword">operator</span> <span class="token keyword">const</span> actual_type<span class="token operator">&amp;</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
</code></pre><h3 id="non_invalidating_vector5" data-id="non_invalidating_vector"><a class="anchor hidden-xs" href="#non_invalidating_vector5" title="non_invalidating_vector5"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>non_invalidating_vector</span></h3><p><code>non_invalidating_vector</code><span> is a container adaptor like </span><code>stack</code><span>, </span><code>queue</code><span> and others. After being constructed, it can non longer be invalidated. It allows the programmer to call all of the non invalidating [member] functions and deletes all of the invalidating [member] functions. It also can be narrowed to </span><code>non_invalidating_vector_ref</code><span> and also to </span><code>const std::vector&amp;</code><span> which is even more restricted. It's primarily meant to be used with the </span><code>C++23</code><span> range based constructor which allows it to be initialized in an ever growing number of ways.</span></p><pre><code class="cpp hljs"><span class="token keyword">template</span><span class="token operator">&lt;</span>
    <span class="token keyword">class</span> <span class="token class-name">T</span><span class="token punctuation">,</span>
    <span class="token keyword">class</span> <span class="token class-name">Allocator</span> <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>allocator<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span><span class="token punctuation">,</span>
    <span class="token keyword">class</span> <span class="token class-name">Container</span> <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span>
<span class="token operator">&gt;</span>
<span class="token keyword">class</span> <span class="token class-name">non_invalidating_vector</span>
<span class="token punctuation">{</span>
<span class="token keyword">private</span><span class="token operator">:</span>
    actual_type inner<span class="token punctuation">;</span>
<span class="token keyword">public</span><span class="token operator">:</span>
    <span class="token comment">// has all of the std::vector constructors</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">(</span><span class="token keyword">noexcept</span><span class="token punctuation">(</span><span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token operator">:</span> <span class="token function">inner</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">explicit</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> alloc <span class="token punctuation">)</span> <span class="token keyword">noexcept</span>
        <span class="token operator">:</span> <span class="token function">inner</span><span class="token punctuation">(</span>alloc<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span> size_type count<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> value<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> alloc <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span>
        <span class="token operator">:</span> <span class="token function">inner</span><span class="token punctuation">(</span>count<span class="token punctuation">,</span> value<span class="token punctuation">,</span> alloc<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
    <span class="token keyword">explicit</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span> size_type count<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> alloc <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span>
        <span class="token operator">:</span> <span class="token function">inner</span><span class="token punctuation">(</span>count<span class="token punctuation">,</span> alloc<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
    <span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span> <span class="token class-name">InputIt</span> <span class="token operator">&gt;</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span> InputIt first<span class="token punctuation">,</span> InputIt last<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> alloc <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span>
        <span class="token operator">:</span> <span class="token function">inner</span><span class="token punctuation">(</span>first<span class="token punctuation">,</span> last<span class="token punctuation">,</span> alloc<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span> <span class="token keyword">const</span> non_invalidating_vector<span class="token operator">&amp;</span> other <span class="token punctuation">)</span>
        <span class="token operator">:</span> <span class="token function">inner</span><span class="token punctuation">(</span>other<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span> <span class="token keyword">const</span> non_invalidating_vector<span class="token operator">&amp;</span> other<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> alloc <span class="token punctuation">)</span>
        <span class="token operator">:</span> <span class="token function">inner</span><span class="token punctuation">(</span>other<span class="token punctuation">,</span> alloc<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span> non_invalidating_vector<span class="token operator">&amp;&amp;</span> other <span class="token punctuation">)</span> <span class="token keyword">noexcept</span>
        <span class="token operator">:</span> <span class="token function">inner</span><span class="token punctuation">(</span>other<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span> non_invalidating_vector<span class="token operator">&amp;&amp;</span> other<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> alloc <span class="token punctuation">)</span>
        <span class="token operator">:</span> <span class="token function">inner</span><span class="token punctuation">(</span>other<span class="token punctuation">,</span> alloc<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span> std<span class="token double-colon punctuation">::</span>initializer_list<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> init<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> alloc <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span>
        <span class="token operator">:</span> <span class="token function">inner</span><span class="token punctuation">(</span>init<span class="token punctuation">,</span> alloc<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
    <span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span> <span class="token class-name">R</span> <span class="token operator">&gt;</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span> std<span class="token double-colon punctuation">::</span>from_range_t<span class="token punctuation">,</span> R<span class="token operator">&amp;&amp;</span> rg<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> alloc <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span>
        <span class="token operator">:</span> <span class="token function">inner</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>from_range<span class="token punctuation">,</span> rg<span class="token punctuation">,</span> alloc<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
    <span class="token comment">// all non invalidating methods are proxied</span>
    <span class="token keyword">constexpr</span> reference <span class="token keyword">operator</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span> size_type pos <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">[</span>pos<span class="token punctuation">]</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_reference <span class="token keyword">operator</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span> size_type pos <span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">[</span>pos<span class="token punctuation">]</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> size_type <span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">// all invalidating methods are deleted</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">resize</span><span class="token punctuation">(</span> size_type count <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token comment">// compatible with non_invalidating_vector_ref</span>
    <span class="token keyword">operator</span> <span class="token generic-function"><span class="token function">non_invalidating_vector_ref</span><span class="token generic class-name"><span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> non_invalidating_vector_ref<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span><span class="token punctuation">{</span>inner<span class="token punctuation">}</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">// can narrow scope to just the const members</span>
    <span class="token keyword">operator</span> <span class="token keyword">const</span> actual_type<span class="token operator">&amp;</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
</code></pre><h2 id="Prior-Work" data-id="Prior-Work"><a class="anchor hidden-xs" href="#Prior-Work" title="Prior-Work"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>Prior Work</span></h2><p><span>This proposal was created to fill the need stated in the </span><code>A framework for Profiles development</code><span> </span><sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup><span> proposal. While </span><code>Guidelines Support Library</code><span> </span><sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup><span> </span><sup class="footnote-ref"><a href="#fn3" id="fnref3">[3]</a></sup><span> still does not have a </span><code>dyn_array</code><span> or a </span><code>static_array</code><span>, </span><code>non_invalidating_vector_ref</code><span> and </span><code>non_invalidating_vector</code><span> together are mean't to provide equivalent intended functionality as </span><code>dyn_array</code><span> but instead of using a new collection, it builds upon what we already have, </span><code>std::vector</code><span>. This proposal, while only the beginning, should get us thinking that it would be valuable from a defensive programming perspective to have non invalidating views of most of our containers and container adaptors eventually.</span></p><table>
<tbody><tr>
<td>
<h3 id="A-framework-for-Profiles-development-11" data-id="A-framework-for-Profiles-development-11"><a class="anchor hidden-xs" href="#A-framework-for-Profiles-development-11" title="A-framework-for-Profiles-development-11"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><code>A framework for Profiles development</code><span> </span><sup class="footnote-ref"><a href="#fn1" id="fnref1-1">[1:1]</a></sup></h3>
</td>
</tr>    
<tr>
<td>
<p><em><span>Why 99%? Well, I could have said 90% and still made the point. What might be an example? Consider </span><span class="smartypants">…</span><span> containers without invalidating operations (e.g., gsl::dyn_array rather than vector) </span><span class="smartypants">…</span><span> .</span></em></p>
</td>
</tr>    
<tr>
<td>
<p><em><strong><span>"3.3. Profile: Concurrency"</span></strong></em></p>
<ul>
<li><em><strong><span>Observation</span></strong><span>:</span></em><span> </span><span class="smartypants">…</span>
<ul>
<li><em><strong><span>Invalidation:</span></strong><span> use </span><span class="smartypants">…</span><span> containers without invalidation (e.g., gsl::dyn_array) to pass information between threads.</span></em></li>
</ul>
</li>
</ul>
</td>
</tr>    
</tbody></table><h2 id="Potential-Improvements" data-id="Potential-Improvements"><a class="anchor hidden-xs" href="#Potential-Improvements" title="Potential-Improvements"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>Potential Improvements</span></h2><p><span>Given any container it would be good to know what is its non_invalidating type and given a container instance, a consistently named member function to get an instance of or reference to the non_invalidating type.</span></p><pre><code class="cpp hljs"><span class="token keyword">namespace</span> std <span class="token punctuation">{</span>
    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">T</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Allocator</span> <span class="token operator">=</span> allocator<span class="token operator">&lt;</span>T<span class="token operator">&gt;&gt;</span>
    <span class="token keyword">class</span> <span class="token class-name">vector</span> <span class="token punctuation">{</span>
    <span class="token keyword">public</span><span class="token operator">:</span>
        <span class="token keyword">using</span> non_invalidating_type <span class="token operator">=</span> non_invalidating_vector<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span><span class="token punctuation">;</span>
        non_invalidating_type <span class="token function">non_invalidating_view</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">return</span> <span class="token function">non_invalidating_type</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p><span>This would allow the user of the container to autocomplete their way to the invalidation free safety.</span></p><h2 id="Alternative" data-id="Alternative"><a class="anchor hidden-xs" href="#Alternative" title="Alternative"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>Alternative</span></h2><h3 id="Refactor-vector" data-id="Refactor-vector"><a class="anchor hidden-xs" href="#Refactor-vector" title="Refactor-vector"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>Refactor vector</span></h3><p><span>Instead of adding two classes to any container, effectively tripling portions of the specification, inheritance could be used instead to split any given container into its invalidating and non invalidating variants</span></p><table>
<tbody><tr>
<th colspan="2">
<p><span>current </span><code>std::vector</code></p>
</th>
</tr>
<tr>
<th>
<p><code>non_invalidating_vector</code><span> base class</span></p>
</th>
<th>
<p><span>future </span><code>std::vector</code></p>
</th>
</tr>
<tr>
<td>
<ul>
<li><span>get_allocator</span></li>
<li><span>at</span></li>
<li><span>operator[]</span></li>
<li><span>front</span></li>
<li><span>back</span></li>
<li><span>data</span></li>
<li><span>begin</span></li>
<li><span>cbegin</span></li>
<li><span>end</span></li>
<li><span>cend</span></li>
<li><span>rbegin</span></li>
<li><span>crbegin</span></li>
<li><span>rend</span></li>
<li><span>crend</span></li>
<li><span>empty</span></li>
<li><span>size</span></li>
<li><span>max_size</span></li>
<li><span>capacity</span></li>
</ul>
</td>
<td>
<ul>
<li><code>operator=</code></li>
<li><span>assign</span></li>
<li><span>assign_range</span></li>
<li><span>shrink_to_fit</span></li>
<li><span>clear</span></li>
<li><span>insert</span></li>
<li><span>insert_range</span></li>
<li><span>emplace</span></li>
<li><span>erase</span></li>
<li><span>push_back</span></li>
<li><span>emplace_back</span></li>
<li><span>append_range</span></li>
<li><span>pop_back</span></li>
<li><span>resize</span></li>
<li><span>swap</span></li>
</ul>
</td>
</tr>
</tbody></table><p><span>This would elevate the usage of this base class as being just a cast thus making it more consistent with a </span><code>const</code><span> cast.</span></p><table>
<tbody><tr>
<th>&nbsp;</th>
<th>
<p><span>non_invalidating_vector</span><br><span>non_invalidating_vector_ref</span></p>
</th>
<th>
<p><span>inheritance</span><br>
<span>non_invalidating_vector base class</span></p>
</th>
</tr>
<tr>
<th>
<p><span>PRO(s)</span></p>
</th>
<td>
<ul>
<li><span>pure addition</span></li>
</ul>
</td>
<td>
<ul>
<li><span>split one class in two</span></li>
</ul>
</td>
</tr>
<tr>
<th>
<p><span>CON(s)</span></p>
</th>
<td>
<ul>
<li><span>requires 2 full classes</span></li>
</ul>
</td>
<td>
<ul>
<li><span>modifies collection class</span></li>
</ul>
</td>
</tr>
</tbody></table><p><span>This would require refactoring any given collection by injecting a base class and relocating the non invalidating member functions to said base class. Since the resolved collection of methods would remain the same in the final collection, no breakage is expected.</span></p><h2 id="Wording" data-id="Wording"><a class="anchor hidden-xs" href="#Wording" title="Wording"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>Wording</span></h2><h3 id="24311-Class-template-non_invalidating_vector_ref-non_invalidating_vector_ref" data-id="24311-Class-template-non_invalidating_vector_ref-non_invalidating_vector_ref"><a class="anchor hidden-xs" href="#24311-Class-template-non_invalidating_vector_ref-non_invalidating_vector_ref" title="24311-Class-template-non_invalidating_vector_ref-non_invalidating_vector_ref"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><ins><span>24.3.11 Class template non_invalidating_vector_ref [non_invalidating_vector_ref]</span></ins></h3><h4 id="243111-Overview-non_invalidating_vector_refoverview" data-id="243111-Overview-non_invalidating_vector_refoverview"><a class="anchor hidden-xs" href="#243111-Overview-non_invalidating_vector_refoverview" title="243111-Overview-non_invalidating_vector_refoverview"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><ins><span>24.3.11.1 Overview [non_invalidating_vector_ref.overview]</span></ins></h4><p><ins><sup><span>1</span></sup><span> A </span><code>non_invalidating_vector_ref</code><span> is a sequence container that supports (amortized) constant time </span><code>insert</code><span> and </span><code>erase</code><span> operations at the end; </span><code>insert</code><span> and </span><code>erase</code><span> in the middle take linear time. Storage management is handled automatically, though hints can be given to improve efficiency.</span></ins></p><p><ins><sup><span>2</span></sup><span> A </span><code>non_invalidating_vector_ref</code><span> meets all of the requirements of a container (24.2.2.2), of a reversible container (24.2.2.3), of an allocator-aware container (24.2.2.5), of a sequence container, including most of the optional sequence container requirements (24.2.4), and, for an element type other than </span><code>bool</code><span>, of a contiguous container (24.2.2.2). The exceptions are the </span><code>push_front</code><span>, </span><code>prepend_range</code><span>, </span><code>pop_front</code><span>, and </span><code>emplace_front</code><span> member functions, which are not provided. Descriptions are provided here only for operations on </span><code>non_invalidating_vector_ref</code><span> that are not described in one of these tables or for operations where there is additional semantic information.</span></ins></p><p><ins><sup><span>3</span></sup><span> The types </span><code>iterator</code><span> and </span><code>const_iterator</code><span> meet the constexpr iterator requirements (25.3.1).</span></ins></p><pre><code class="cpp hljs"><span class="token keyword">namespace</span> std <span class="token punctuation">{</span>
    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">T</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Allocator</span> <span class="token operator">=</span> allocator<span class="token operator">&lt;</span>T<span class="token operator">&gt;&gt;</span>
    <span class="token keyword">class</span> <span class="token class-name">non_invalidating_vector_ref</span> <span class="token punctuation">{</span>
    <span class="token keyword">public</span><span class="token operator">:</span>
        <span class="token comment">// types</span>
        <span class="token keyword">using</span> actual_type <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span><span class="token punctuation">;</span>
        <span class="token keyword">using</span> value_type <span class="token operator">=</span> T<span class="token punctuation">;</span>
        <span class="token keyword">using</span> allocator_type <span class="token operator">=</span> Allocator<span class="token punctuation">;</span>
        <span class="token keyword">using</span> pointer <span class="token operator">=</span> <span class="token keyword">typename</span> <span class="token class-name">allocator_traits</span><span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>pointer<span class="token punctuation">;</span>
        <span class="token keyword">using</span> const_pointer <span class="token operator">=</span> <span class="token keyword">typename</span> <span class="token class-name">allocator_traits</span><span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>const_pointer<span class="token punctuation">;</span>
        <span class="token keyword">using</span> reference <span class="token operator">=</span> value_type<span class="token operator">&amp;</span><span class="token punctuation">;</span>
        <span class="token keyword">using</span> const_reference <span class="token operator">=</span> <span class="token keyword">const</span> value_type<span class="token operator">&amp;</span><span class="token punctuation">;</span>
        <span class="token keyword">using</span> size_type <span class="token operator">=</span> implementation<span class="token operator">-</span>defined <span class="token punctuation">;</span> <span class="token comment">// see 24.2</span>
        <span class="token keyword">using</span> difference_type <span class="token operator">=</span> implementation<span class="token operator">-</span>defined <span class="token punctuation">;</span> <span class="token comment">// see 24.2</span>
        <span class="token keyword">using</span> iterator <span class="token operator">=</span> implementation<span class="token operator">-</span>defined <span class="token punctuation">;</span> <span class="token comment">// see 24.2</span>
        <span class="token keyword">using</span> const_iterator <span class="token operator">=</span> implementation<span class="token operator">-</span>defined <span class="token punctuation">;</span> <span class="token comment">// see 24.2</span>
        <span class="token keyword">using</span> reverse_iterator <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>reverse_iterator<span class="token operator">&lt;</span>iterator<span class="token operator">&gt;</span><span class="token punctuation">;</span>
        <span class="token keyword">using</span> const_reverse_iterator <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>reverse_iterator<span class="token operator">&lt;</span>const_iterator<span class="token operator">&gt;</span><span class="token punctuation">;</span>

        <span class="token comment">// 24.3.11.2, construct/copy/destroy</span>
        <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector_ref</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector_ref</span><span class="token punctuation">(</span><span class="token keyword">const</span> non_invalidating_vector_ref<span class="token operator">&amp;</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">default</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector_ref</span><span class="token punctuation">(</span>non_invalidating_vector_ref<span class="token operator">&amp;&amp;</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">default</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> non_invalidating_vector_ref <span class="token keyword">operator</span><span class="token operator">=</span><span class="token punctuation">(</span><span class="token keyword">const</span> non_invalidating_vector_ref<span class="token operator">&amp;</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> non_invalidating_vector_ref <span class="token keyword">operator</span><span class="token operator">=</span><span class="token punctuation">(</span><span class="token keyword">const</span> non_invalidating_vector_ref<span class="token operator">&amp;&amp;</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector_ref</span><span class="token punctuation">(</span>actual_type<span class="token operator">&amp;</span> reference<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token operator">~</span><span class="token function">non_invalidating_vector_ref</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">InputIterator</span><span class="token operator">&gt;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">assign</span><span class="token punctuation">(</span>InputIterator first<span class="token punctuation">,</span> InputIterator last<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">template</span><span class="token operator">&lt;</span>container<span class="token operator">-</span>compatible<span class="token operator">-</span>range <span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> R<span class="token operator">&gt;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">assign_range</span><span class="token punctuation">(</span>R<span class="token operator">&amp;&amp;</span> rg<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">assign</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> u<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">assign</span><span class="token punctuation">(</span>initializer_list<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> allocator_type <span class="token function">get_allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

        <span class="token comment">// iterators</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_iterator <span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_iterator <span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> reverse_iterator <span class="token function">rbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reverse_iterator <span class="token function">rbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> reverse_iterator <span class="token function">rend</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reverse_iterator <span class="token function">rend</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

        <span class="token keyword">constexpr</span> const_iterator <span class="token function">cbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_iterator <span class="token function">cend</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reverse_iterator <span class="token function">crbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reverse_iterator <span class="token function">crend</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

        <span class="token comment">// 24.3.11.3, capacity</span>
        <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token keyword">constexpr</span> <span class="token keyword">bool</span> <span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> size_type <span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> size_type <span class="token function">max_size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> size_type <span class="token function">capacity</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">resize</span><span class="token punctuation">(</span>size_type sz<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">resize</span><span class="token punctuation">(</span>size_type sz<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> c<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">reserve</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">shrink_to_fit</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>

        <span class="token comment">// element access</span>
        <span class="token keyword">constexpr</span> reference <span class="token keyword">operator</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reference <span class="token keyword">operator</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reference <span class="token function">at</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> reference <span class="token function">at</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> reference <span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reference <span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> reference <span class="token function">back</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reference <span class="token function">back</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>

        <span class="token comment">// 24.3.11.4, data access</span>
        <span class="token keyword">constexpr</span> T<span class="token operator">*</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">const</span> T<span class="token operator">*</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

        <span class="token comment">// 24.3.11.5, modifers</span>
        <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> Args<span class="token operator">&gt;</span> <span class="token keyword">constexpr</span> reference <span class="token function">emplace_back</span><span class="token punctuation">(</span>Args<span class="token operator">&amp;&amp;</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> args<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">push_back</span><span class="token punctuation">(</span><span class="token keyword">const</span> T<span class="token operator">&amp;</span> x<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">push_back</span><span class="token punctuation">(</span>T<span class="token operator">&amp;&amp;</span> x<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">template</span><span class="token operator">&lt;</span>container<span class="token operator">-</span>compatible<span class="token operator">-</span>range <span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> R<span class="token operator">&gt;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">append_range</span><span class="token punctuation">(</span>R<span class="token operator">&amp;&amp;</span> rg<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">pop_back</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>

        <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> Args<span class="token operator">&gt;</span> <span class="token keyword">constexpr</span> iterator <span class="token function">emplace</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> Args<span class="token operator">&amp;&amp;</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> args<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> x<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> T<span class="token operator">&amp;&amp;</span> x<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> size_type n<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> x<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">InputIterator</span><span class="token operator">&gt;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span>
            InputIterator first<span class="token punctuation">,</span> InputIterator last<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">template</span><span class="token operator">&lt;</span>container<span class="token operator">-</span>compatible<span class="token operator">-</span>range <span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> R<span class="token operator">&gt;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">insert_range</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> R<span class="token operator">&amp;&amp;</span> rg<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> initializer_list<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> il<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">erase</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">erase</span><span class="token punctuation">(</span>const_iterator first<span class="token punctuation">,</span> const_iterator last<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">swap</span><span class="token punctuation">(</span>non_invalidating_vector_ref<span class="token operator">&amp;</span><span class="token punctuation">)</span>
            <span class="token keyword">noexcept</span><span class="token punctuation">(</span>allocator_traits<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>propagate_on_container_swap<span class="token double-colon punctuation">::</span>value <span class="token operator">||</span>
            allocator_traits<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>is_always_equal<span class="token double-colon punctuation">::</span>value<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>

        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">clear</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        
        <span class="token keyword">operator</span> <span class="token keyword">const</span> actual_type<span class="token operator">&amp;</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">InputIterator</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Allocator</span> <span class="token operator">=</span> allocator<span class="token operator">&lt;</span>iter<span class="token operator">-</span>value<span class="token operator">-</span>type <span class="token operator">&lt;</span>InputIterator<span class="token operator">&gt;&gt;</span><span class="token operator">&gt;</span>
<span class="token function">non_invalidating_vector_ref</span><span class="token punctuation">(</span>InputIterator<span class="token punctuation">,</span> InputIterator<span class="token punctuation">,</span> Allocator <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
    <span class="token operator">-&gt;</span> non_invalidating_vector_ref<span class="token operator">&lt;</span>iter<span class="token operator">-</span>value<span class="token operator">-</span>type <span class="token operator">&lt;</span>InputIterator<span class="token operator">&gt;</span><span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span>ranges<span class="token double-colon punctuation">::</span>input_range R<span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Allocator</span> <span class="token operator">=</span> allocator<span class="token operator">&lt;</span>ranges<span class="token double-colon punctuation">::</span>range_value_t<span class="token operator">&lt;</span>R<span class="token operator">&gt;&gt;</span><span class="token operator">&gt;</span>
<span class="token function">non_invalidating_vector_ref</span><span class="token punctuation">(</span>from_range_t<span class="token punctuation">,</span> R<span class="token operator">&amp;&amp;</span><span class="token punctuation">,</span> Allocator <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
    <span class="token operator">-&gt;</span> non_invalidating_vector_ref<span class="token operator">&lt;</span>ranges<span class="token double-colon punctuation">::</span>range_value_t<span class="token operator">&lt;</span>R<span class="token operator">&gt;</span><span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><p><ins><sup><span>4</span></sup><span> An incomplete type T may be used when instantiating </span><code>non_invalidating_vector_ref</code><span> if the allocator meets the allocator completeness requirements (16.4.4.6.2). T shall be complete before any member of the resulting specialization of </span><code>non_invalidating_vector_ref</code><span> is referenced.</span></ins></p><h4 id="243112-Constructors-non_invalidating_vector_refcons" data-id="243112-Constructors-non_invalidating_vector_refcons"><a class="anchor hidden-xs" href="#243112-Constructors-non_invalidating_vector_refcons" title="243112-Constructors-non_invalidating_vector_refcons"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><ins><span>24.3.11.2 Constructors [non_invalidating_vector_ref.cons]</span></ins></h4><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> <span class="token keyword">explicit</span> <span class="token function">non_invalidating_vector_ref</span><span class="token punctuation">(</span><span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
</code></pre><p><ins><sup><span>1</span></sup><span> </span><em><span>Eﬀects</span></em><span>: Constructs an empty </span><code>non_invalidating_vector_ref</code><span>, using the specifed allocator.</span></ins></p><p><ins><sup><span>2</span></sup><span> </span><em><span>Complexity</span></em><span>: Constant.</span></ins></p><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> <span class="token keyword">explicit</span> <span class="token function">non_invalidating_vector_ref</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><ins><sup><span>3</span></sup><span> </span><em><span>Preconditions</span></em><span>: T is </span><code>Cpp17DefaultInsertable</code><span> into </span><code>*this</code><span>.</span></ins></p><p><ins><sup><span>4</span></sup><span> </span><em><span>Eﬀects</span></em><span>: Constructs a </span><code>non_invalidating_vector_ref</code><span> with n default-inserted elements using the specifed allocator.</span></ins></p><p><ins><sup><span>5</span></sup><span> </span><em><span>Complexity</span></em><span>: Linear in n.</span></ins></p><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector_ref</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> value<span class="token punctuation">,</span>
    <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><ins><sup><span>6</span></sup><span> </span><em><span>Preconditions</span></em><span>: T is </span><code>Cpp17CopyInsertable</code><span> into *this.</span></ins></p><p><ins><sup><span>7</span></sup><span> </span><em><span>Eﬀects</span></em><span>: Constructs a </span><code>non_invalidating_vector_ref</code><span> with n copies of value, using the specifed allocator.</span></ins></p><p><ins><sup><span>8</span></sup><span> </span><em><span>Complexity</span></em><span>: Linear in n.</span></ins></p><pre><code class="cpp hljs"><span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">InputIterator</span><span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector_ref</span><span class="token punctuation">(</span>InputIterator first<span class="token punctuation">,</span> InputIterator last<span class="token punctuation">,</span>
    <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><ins><sup><span>9</span></sup><span> </span><em><span>Eﬀects</span></em><span>: Constructs a non_invalidating_vector_ref equal to the range </span><code>[first, last)</code><span>, using the specifed allocator.</span></ins></p><p><ins><sup><span>10</span></sup><span> </span><em><span>Complexity</span></em><span>: Makes only N calls to the copy constructor of T (where N is the distance between first and last) and no reallocations if iterators first and last are of forward, bidirectional, or random access categories. It makes order N calls to the copy constructor of T and order log N reallocations if they are just input iterators.</span></ins></p><pre><code class="cpp hljs"><span class="token keyword">template</span><span class="token operator">&lt;</span>container<span class="token operator">-</span>compatible<span class="token operator">-</span>range <span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> R<span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector_ref</span><span class="token punctuation">(</span>from_range_t<span class="token punctuation">,</span> R<span class="token operator">&amp;&amp;</span> rg<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><ins><sup><span>11</span></sup><span> </span><em><span>Eﬀects</span></em><span>: Constructs a </span><code>non_invalidating_vector_ref</code><span> object with the elements of the range rg, using the specifed allocator.</span></ins></p><p><ins><sup><span>12</span></sup><span> </span><em><span>Complexity</span></em><span>: Initializes exactly N elements from the results of dereferencing successive iterators of rg, where N is </span><code>ranges::distance(rg)</code><span>. Performs no reallocations if R models ranges::forward_range or </span><code>ranges::sized_range</code><span>; otherwise, performs order log N reallocations and order N calls to the copy or move constructor of T.</span></ins></p><h4 id="243113-Capacity-non_invalidating_vector_refcapacity" data-id="243113-Capacity-non_invalidating_vector_refcapacity"><a class="anchor hidden-xs" href="#243113-Capacity-non_invalidating_vector_refcapacity" title="243113-Capacity-non_invalidating_vector_refcapacity"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><ins><span>24.3.11.3 Capacity [non_invalidating_vector_ref.capacity]</span></ins></h4><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> size_type <span class="token function">capacity</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
</code></pre><p><ins><sup><span>1</span></sup><span> </span><em><span>Returns</span></em><span>: The total number of elements that the </span><code>non_invalidating_vector_ref</code><span> can hold without requiring reallocation.</span></ins></p><p><ins><sup><span>2</span></sup><span> </span><em><span>Complexity</span></em><span>: Constant time.</span></ins></p><h4 id="243114-Data-non_invalidating_vector_refdata" data-id="243114-Data-non_invalidating_vector_refdata"><a class="anchor hidden-xs" href="#243114-Data-non_invalidating_vector_refdata" title="243114-Data-non_invalidating_vector_refdata"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><ins><span>24.3.11.4 Data [non_invalidating_vector_ref.data]</span></ins></h4><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> T<span class="token operator">*</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
<span class="token keyword">constexpr</span> <span class="token keyword">const</span> T<span class="token operator">*</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
</code></pre><p><ins><sup><span>1</span></sup><span> </span><em><span>Returns</span></em><span>: A pointer such that </span><code>[data(), data() + size())</code><span> is a valid range. For a non-empty non_invalidating_vector_ref, </span><code>data() == addressof(front())</code><span> is </span><code>true</code><span>.</span></ins></p><p><ins><sup><span>2</span></sup><span> </span><em><span>Complexity</span></em><span>: Constant time.</span></ins></p><h3 id="24311-Class-template-non_invalidating_vector-non_invalidating_vector" data-id="24311-Class-template-non_invalidating_vector-non_invalidating_vector"><a class="anchor hidden-xs" href="#24311-Class-template-non_invalidating_vector-non_invalidating_vector" title="24311-Class-template-non_invalidating_vector-non_invalidating_vector"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><ins><span>24.3.11 Class template non_invalidating_vector [non_invalidating_vector]</span></ins></h3><h4 id="243111-Overview-non_invalidating_vectoroverview" data-id="243111-Overview-non_invalidating_vectoroverview"><a class="anchor hidden-xs" href="#243111-Overview-non_invalidating_vectoroverview" title="243111-Overview-non_invalidating_vectoroverview"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><ins><span>24.3.11.1 Overview [non_invalidating_vector.overview]</span></ins></h4><p><ins><sup><span>1</span></sup><span> A </span><code>non_invalidating_vector</code><span> is a sequence container that supports (amortized) constant time </span><code>insert</code><span> and </span><code>erase</code><span> operations at the end; </span><code>insert</code><span> and </span><code>erase</code><span> in the middle take linear time. Storage management is handled automatically, though hints can be given to improve efficiency.</span></ins></p><p><ins><sup><span>2</span></sup><span> A </span><code>non_invalidating_vector</code><span> meets all of the requirements of a container (24.2.2.2), of a reversible container (24.2.2.3), of an allocator-aware container (24.2.2.5), of a sequence container, including most of the optional sequence container requirements (24.2.4), and, for an element type other than </span><code>bool</code><span>, of a contiguous container (24.2.2.2). The exceptions are the </span><code>push_front</code><span>, </span><code>prepend_range</code><span>, </span><code>pop_front</code><span>, and </span><code>emplace_front</code><span> member functions, which are not provided. Descriptions are provided here only for operations on </span><code>non_invalidating_vector</code><span> that are not described in one of these tables or for operations where there is additional semantic information.</span></ins></p><p><ins><sup><span>3</span></sup><span> The types </span><code>iterator</code><span> and </span><code>const_iterator</code><span> meet the constexpr iterator requirements (25.3.1).</span></ins></p><pre><code class="cpp hljs"><span class="token keyword">namespace</span> std <span class="token punctuation">{</span>
    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">T</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Allocator</span> <span class="token operator">=</span> allocator<span class="token operator">&lt;</span>T<span class="token operator">&gt;&gt;</span>
    <span class="token keyword">class</span> <span class="token class-name">non_invalidating_vector</span> <span class="token punctuation">{</span>
    <span class="token keyword">public</span><span class="token operator">:</span>
        <span class="token comment">// types</span>
        <span class="token keyword">using</span> actual_type <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span><span class="token punctuation">;</span>
        <span class="token keyword">using</span> value_type <span class="token operator">=</span> T<span class="token punctuation">;</span>
        <span class="token keyword">using</span> allocator_type <span class="token operator">=</span> Allocator<span class="token punctuation">;</span>
        <span class="token keyword">using</span> pointer <span class="token operator">=</span> <span class="token keyword">typename</span> <span class="token class-name">allocator_traits</span><span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>pointer<span class="token punctuation">;</span>
        <span class="token keyword">using</span> const_pointer <span class="token operator">=</span> <span class="token keyword">typename</span> <span class="token class-name">allocator_traits</span><span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>const_pointer<span class="token punctuation">;</span>
        <span class="token keyword">using</span> reference <span class="token operator">=</span> value_type<span class="token operator">&amp;</span><span class="token punctuation">;</span>
        <span class="token keyword">using</span> const_reference <span class="token operator">=</span> <span class="token keyword">const</span> value_type<span class="token operator">&amp;</span><span class="token punctuation">;</span>
        <span class="token keyword">using</span> size_type <span class="token operator">=</span> implementation<span class="token operator">-</span>defined <span class="token punctuation">;</span> <span class="token comment">// see 24.2</span>
        <span class="token keyword">using</span> difference_type <span class="token operator">=</span> implementation<span class="token operator">-</span>defined <span class="token punctuation">;</span> <span class="token comment">// see 24.2</span>
        <span class="token keyword">using</span> iterator <span class="token operator">=</span> implementation<span class="token operator">-</span>defined <span class="token punctuation">;</span> <span class="token comment">// see 24.2</span>
        <span class="token keyword">using</span> const_iterator <span class="token operator">=</span> implementation<span class="token operator">-</span>defined <span class="token punctuation">;</span> <span class="token comment">// see 24.2</span>
        <span class="token keyword">using</span> reverse_iterator <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>reverse_iterator<span class="token operator">&lt;</span>iterator<span class="token operator">&gt;</span><span class="token punctuation">;</span>
        <span class="token keyword">using</span> const_reverse_iterator <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>reverse_iterator<span class="token operator">&lt;</span>const_iterator<span class="token operator">&gt;</span><span class="token punctuation">;</span>

        <span class="token comment">// 24.3.11.2, construct/copy/destroy</span>
        <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">(</span><span class="token keyword">noexcept</span><span class="token punctuation">(</span><span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">:</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span><span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">explicit</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span><span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">explicit</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> value<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">InputIterator</span><span class="token operator">&gt;</span>
        <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>InputIterator first<span class="token punctuation">,</span> InputIterator last<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">template</span><span class="token operator">&lt;</span>container<span class="token operator">-</span>compatible<span class="token operator">-</span>range <span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> R<span class="token operator">&gt;</span>
        <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>from_range_t<span class="token punctuation">,</span> R<span class="token operator">&amp;&amp;</span> rg<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span><span class="token keyword">const</span> non_invalidating_vector<span class="token operator">&amp;</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>non_invalidating_vector<span class="token operator">&amp;&amp;</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span><span class="token keyword">const</span> non_invalidating_vector<span class="token operator">&amp;</span><span class="token punctuation">,</span> <span class="token keyword">const</span> type_identity_t<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token operator">&amp;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>non_invalidating_vector<span class="token operator">&amp;&amp;</span><span class="token punctuation">,</span> <span class="token keyword">const</span> type_identity_t<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token operator">&amp;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>initializer_list<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span><span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token operator">~</span><span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> non_invalidating_vector<span class="token operator">&amp;</span> <span class="token keyword">operator</span><span class="token operator">=</span><span class="token punctuation">(</span><span class="token keyword">const</span> non_invalidating_vector<span class="token operator">&amp;</span> x<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> non_invalidating_vector<span class="token operator">&amp;</span> <span class="token keyword">operator</span><span class="token operator">=</span><span class="token punctuation">(</span>non_invalidating_vector<span class="token operator">&amp;&amp;</span> x<span class="token punctuation">)</span>
            <span class="token keyword">noexcept</span><span class="token punctuation">(</span>allocator_traits<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>propagate_on_container_move_assignment<span class="token double-colon punctuation">::</span>value <span class="token operator">||</span>
            allocator_traits<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>is_always_equal<span class="token double-colon punctuation">::</span>value<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> non_invalidating_vector<span class="token operator">&amp;</span> <span class="token keyword">operator</span><span class="token operator">=</span><span class="token punctuation">(</span>initializer_list<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">InputIterator</span><span class="token operator">&gt;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">assign</span><span class="token punctuation">(</span>InputIterator first<span class="token punctuation">,</span> InputIterator last<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">template</span><span class="token operator">&lt;</span>container<span class="token operator">-</span>compatible<span class="token operator">-</span>range <span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> R<span class="token operator">&gt;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">assign_range</span><span class="token punctuation">(</span>R<span class="token operator">&amp;&amp;</span> rg<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">assign</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> u<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">assign</span><span class="token punctuation">(</span>initializer_list<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> allocator_type <span class="token function">get_allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

        <span class="token comment">// iterators</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_iterator <span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_iterator <span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> reverse_iterator <span class="token function">rbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reverse_iterator <span class="token function">rbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> reverse_iterator <span class="token function">rend</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reverse_iterator <span class="token function">rend</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

        <span class="token keyword">constexpr</span> const_iterator <span class="token function">cbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_iterator <span class="token function">cend</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reverse_iterator <span class="token function">crbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reverse_iterator <span class="token function">crend</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

        <span class="token comment">// 24.3.11.3, capacity</span>
        <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token keyword">constexpr</span> <span class="token keyword">bool</span> <span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> size_type <span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> size_type <span class="token function">max_size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> size_type <span class="token function">capacity</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">resize</span><span class="token punctuation">(</span>size_type sz<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">resize</span><span class="token punctuation">(</span>size_type sz<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> c<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">reserve</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">shrink_to_fit</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>

        <span class="token comment">// element access</span>
        <span class="token keyword">constexpr</span> reference <span class="token keyword">operator</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reference <span class="token keyword">operator</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reference <span class="token function">at</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> reference <span class="token function">at</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> reference <span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reference <span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> reference <span class="token function">back</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reference <span class="token function">back</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>

        <span class="token comment">// 24.3.11.4, data access</span>
        <span class="token keyword">constexpr</span> T<span class="token operator">*</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">const</span> T<span class="token operator">*</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

        <span class="token comment">// 24.3.11.5, modifers</span>
        <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> Args<span class="token operator">&gt;</span> <span class="token keyword">constexpr</span> reference <span class="token function">emplace_back</span><span class="token punctuation">(</span>Args<span class="token operator">&amp;&amp;</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> args<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">push_back</span><span class="token punctuation">(</span><span class="token keyword">const</span> T<span class="token operator">&amp;</span> x<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">push_back</span><span class="token punctuation">(</span>T<span class="token operator">&amp;&amp;</span> x<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">template</span><span class="token operator">&lt;</span>container<span class="token operator">-</span>compatible<span class="token operator">-</span>range <span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> R<span class="token operator">&gt;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">append_range</span><span class="token punctuation">(</span>R<span class="token operator">&amp;&amp;</span> rg<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">pop_back</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>

        <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> Args<span class="token operator">&gt;</span> <span class="token keyword">constexpr</span> iterator <span class="token function">emplace</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> Args<span class="token operator">&amp;&amp;</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> args<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> x<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> T<span class="token operator">&amp;&amp;</span> x<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> size_type n<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> x<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">InputIterator</span><span class="token operator">&gt;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span>
            InputIterator first<span class="token punctuation">,</span> InputIterator last<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">template</span><span class="token operator">&lt;</span>container<span class="token operator">-</span>compatible<span class="token operator">-</span>range <span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> R<span class="token operator">&gt;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">insert_range</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> R<span class="token operator">&amp;&amp;</span> rg<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> initializer_list<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> il<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">erase</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">erase</span><span class="token punctuation">(</span>const_iterator first<span class="token punctuation">,</span> const_iterator last<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">swap</span><span class="token punctuation">(</span>non_invalidating_vector<span class="token operator">&amp;</span><span class="token punctuation">)</span>
            <span class="token keyword">noexcept</span><span class="token punctuation">(</span>allocator_traits<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>propagate_on_container_swap<span class="token double-colon punctuation">::</span>value <span class="token operator">||</span>
            allocator_traits<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>is_always_equal<span class="token double-colon punctuation">::</span>value<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>

        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">clear</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>

        <span class="token keyword">operator</span> <span class="token generic-function"><span class="token function">non_invalidating_vector_ref</span><span class="token generic class-name"><span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">operator</span> <span class="token keyword">const</span> actual_type<span class="token operator">&amp;</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">InputIterator</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Allocator</span> <span class="token operator">=</span> allocator<span class="token operator">&lt;</span>iter<span class="token operator">-</span>value<span class="token operator">-</span>type <span class="token operator">&lt;</span>InputIterator<span class="token operator">&gt;&gt;</span><span class="token operator">&gt;</span>
<span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>InputIterator<span class="token punctuation">,</span> InputIterator<span class="token punctuation">,</span> Allocator <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
    <span class="token operator">-&gt;</span> non_invalidating_vector<span class="token operator">&lt;</span>iter<span class="token operator">-</span>value<span class="token operator">-</span>type <span class="token operator">&lt;</span>InputIterator<span class="token operator">&gt;</span><span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span>ranges<span class="token double-colon punctuation">::</span>input_range R<span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Allocator</span> <span class="token operator">=</span> allocator<span class="token operator">&lt;</span>ranges<span class="token double-colon punctuation">::</span>range_value_t<span class="token operator">&lt;</span>R<span class="token operator">&gt;&gt;</span><span class="token operator">&gt;</span>
<span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>from_range_t<span class="token punctuation">,</span> R<span class="token operator">&amp;&amp;</span><span class="token punctuation">,</span> Allocator <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
    <span class="token operator">-&gt;</span> non_invalidating_vector<span class="token operator">&lt;</span>ranges<span class="token double-colon punctuation">::</span>range_value_t<span class="token operator">&lt;</span>R<span class="token operator">&gt;</span><span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><p><ins><sup><span>4</span></sup><span> An incomplete type T may be used when instantiating </span><code>non_invalidating_vector</code><span> if the allocator meets the allocator completeness requirements (16.4.4.6.2). T shall be complete before any member of the resulting specialization of </span><code>non_invalidating_vector</code><span> is referenced.</span></ins></p><h4 id="243112-Constructors-non_invalidating_vectorcons" data-id="243112-Constructors-non_invalidating_vectorcons"><a class="anchor hidden-xs" href="#243112-Constructors-non_invalidating_vectorcons" title="243112-Constructors-non_invalidating_vectorcons"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><ins><span>24.3.11.2 Constructors [non_invalidating_vector.cons]</span></ins></h4><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> <span class="token keyword">explicit</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span><span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
</code></pre><p><ins><sup><span>1</span></sup><span> </span><em><span>Eﬀects</span></em><span>: Constructs an empty </span><code>non_invalidating_vector</code><span>, using the specifed allocator.</span></ins></p><p><ins><sup><span>2</span></sup><span> </span><em><span>Complexity</span></em><span>: Constant.</span></ins></p><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> <span class="token keyword">explicit</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><ins><sup><span>3</span></sup><span> </span><em><span>Preconditions</span></em><span>: T is </span><code>Cpp17DefaultInsertable</code><span> into </span><code>*this</code><span>.</span></ins></p><p><ins><sup><span>4</span></sup><span> </span><em><span>Eﬀects</span></em><span>: Constructs a </span><code>non_invalidating_vector</code><span> with n default-inserted elements using the specifed allocator.</span></ins></p><p><ins><sup><span>5</span></sup><span> </span><em><span>Complexity</span></em><span>: Linear in n.</span></ins></p><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> value<span class="token punctuation">,</span>
    <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><ins><sup><span>6</span></sup><span> </span><em><span>Preconditions</span></em><span>: T is </span><code>Cpp17CopyInsertable</code><span> into *this.</span></ins></p><p><ins><sup><span>7</span></sup><span> </span><em><span>Eﬀects</span></em><span>: Constructs a </span><code>non_invalidating_vector</code><span> with n copies of value, using the specifed allocator.</span></ins></p><p><ins><sup><span>8</span></sup><span> </span><em><span>Complexity</span></em><span>: Linear in n.</span></ins></p><pre><code class="cpp hljs"><span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">InputIterator</span><span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>InputIterator first<span class="token punctuation">,</span> InputIterator last<span class="token punctuation">,</span>
    <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><ins><sup><span>9</span></sup><span> </span><em><span>Eﬀects</span></em><span>: Constructs a non_invalidating_vector equal to the range </span><code>[first, last)</code><span>, using the specifed allocator.</span></ins></p><p><ins><sup><span>10</span></sup><span> </span><em><span>Complexity</span></em><span>: Makes only N calls to the copy constructor of T (where N is the distance between first and last) and no reallocations if iterators first and last are of forward, bidirectional, or random access categories. It makes order N calls to the copy constructor of T and order log N reallocations if they are just input iterators.</span></ins></p><pre><code class="cpp hljs"><span class="token keyword">template</span><span class="token operator">&lt;</span>container<span class="token operator">-</span>compatible<span class="token operator">-</span>range <span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> R<span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>from_range_t<span class="token punctuation">,</span> R<span class="token operator">&amp;&amp;</span> rg<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><ins><sup><span>11</span></sup><span> </span><em><span>Eﬀects</span></em><span>: Constructs a </span><code>non_invalidating_vector</code><span> object with the elements of the range rg, using the specifed allocator.</span></ins></p><p><ins><sup><span>12</span></sup><span> </span><em><span>Complexity</span></em><span>: Initializes exactly N elements from the results of dereferencing successive iterators of rg, where N is </span><code>ranges::distance(rg)</code><span>. Performs no reallocations if R models ranges::forward_range or </span><code>ranges::sized_range</code><span>; otherwise, performs order log N reallocations and order N calls to the copy or move constructor of T.</span></ins></p><h4 id="243113-Capacity-non_invalidating_vectorcapacity" data-id="243113-Capacity-non_invalidating_vectorcapacity"><a class="anchor hidden-xs" href="#243113-Capacity-non_invalidating_vectorcapacity" title="243113-Capacity-non_invalidating_vectorcapacity"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><ins><span>24.3.11.3 Capacity [non_invalidating_vector.capacity]</span></ins></h4><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> size_type <span class="token function">capacity</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
</code></pre><p><ins><sup><span>1</span></sup><span> </span><em><span>Returns</span></em><span>: The total number of elements that the </span><code>non_invalidating_vector</code><span> can hold without requiring reallocation.</span></ins></p><p><ins><sup><span>2</span></sup><span> </span><em><span>Complexity</span></em><span>: Constant time.</span></ins></p><h4 id="243114-Data-non_invalidating_vectordata" data-id="243114-Data-non_invalidating_vectordata"><a class="anchor hidden-xs" href="#243114-Data-non_invalidating_vectordata" title="243114-Data-non_invalidating_vectordata"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><ins><span>24.3.11.4 Data [non_invalidating_vector.data]</span></ins></h4><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> T<span class="token operator">*</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
<span class="token keyword">constexpr</span> <span class="token keyword">const</span> T<span class="token operator">*</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
</code></pre><p><ins><sup><span>1</span></sup><span> </span><em><span>Returns</span></em><span>: A pointer such that </span><code>[data(), data() + size())</code><span> is a valid range. For a non-empty non_invalidating_vector, </span><code>data() == addressof(front())</code><span> is </span><code>true</code><span>.</span></ins></p><p><ins><sup><span>2</span></sup><span> </span><em><span>Complexity</span></em><span>: Constant time.</span></ins></p><hr><p><ins><sup><span>207)</span></sup><span> </span><code>reserve()</code><span> uses </span><code>Allocator::allocate()</code><span> which can throw an appropriate exception.</span></ins></p><h2 id="Alternate-Wording" data-id="Alternate-Wording"><a class="anchor hidden-xs" href="#Alternate-Wording" title="Alternate-Wording"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>Alternate Wording</span></h2><h3 id="24311-Class-template-non_invalidating_vector-non_invalidating_vector23" data-id="24311-Class-template-non_invalidating_vector-non_invalidating_vector"><a class="anchor hidden-xs" href="#24311-Class-template-non_invalidating_vector-non_invalidating_vector23" title="24311-Class-template-non_invalidating_vector-non_invalidating_vector23"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><ins><span>24.3.11 Class template non_invalidating_vector [non_invalidating_vector]</span></ins></h3><h4 id="243111-Overview-non_invalidating_vectoroverview24" data-id="243111-Overview-non_invalidating_vectoroverview"><a class="anchor hidden-xs" href="#243111-Overview-non_invalidating_vectoroverview24" title="243111-Overview-non_invalidating_vectoroverview24"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><ins><span>24.3.11.1 Overview [non_invalidating_vector.overview]</span></ins></h4><p><ins><sup><span>1</span></sup><span> A </span><code>non_invalidating_vector</code><span> is a sequence container. Storage management is handled automatically, though hints can be given to improve efficiency.</span></ins></p><p><ins><sup><span>2</span></sup><span> A </span><code>non_invalidating_vector</code><span> meets all of the requirements of a container (24.2.2.2), of a reversible container (24.2.2.3), of an allocator-aware container (24.2.2.5), of a sequence container, including most of the optional sequence container requirements (24.2.4), and, for an element type other than </span><code>bool</code><span>, of a contiguous container (24.2.2.2). The exceptions are the </span><code>push_front</code><span>, </span><code>prepend_range</code><span>, </span><code>pop_front</code><span>, and </span><code>emplace_front</code><span> member functions, which are not provided. Descriptions are provided here only for operations on </span><code>non_invalidating_vector</code><span> that are not described in one of these tables or for operations where there is additional semantic information.</span></ins></p><p><ins><sup><span>3</span></sup><span> The types </span><code>iterator</code><span> and </span><code>const_iterator</code><span> meet the constexpr iterator requirements (25.3.1).</span></ins></p><pre><code class="cpp hljs"><span class="token keyword">namespace</span> std <span class="token punctuation">{</span>
    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">T</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Allocator</span> <span class="token operator">=</span> allocator<span class="token operator">&lt;</span>T<span class="token operator">&gt;&gt;</span>
    <span class="token keyword">class</span> <span class="token class-name">non_invalidating_vector</span> <span class="token punctuation">{</span>
    <span class="token keyword">public</span><span class="token operator">:</span>
        <span class="token comment">// types</span>
        <span class="token keyword">using</span> actual_type <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span><span class="token punctuation">;</span>
        <span class="token keyword">using</span> value_type <span class="token operator">=</span> T<span class="token punctuation">;</span>
        <span class="token keyword">using</span> allocator_type <span class="token operator">=</span> Allocator<span class="token punctuation">;</span>
        <span class="token keyword">using</span> pointer <span class="token operator">=</span> <span class="token keyword">typename</span> <span class="token class-name">allocator_traits</span><span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>pointer<span class="token punctuation">;</span>
        <span class="token keyword">using</span> const_pointer <span class="token operator">=</span> <span class="token keyword">typename</span> <span class="token class-name">allocator_traits</span><span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>const_pointer<span class="token punctuation">;</span>
        <span class="token keyword">using</span> reference <span class="token operator">=</span> value_type<span class="token operator">&amp;</span><span class="token punctuation">;</span>
        <span class="token keyword">using</span> const_reference <span class="token operator">=</span> <span class="token keyword">const</span> value_type<span class="token operator">&amp;</span><span class="token punctuation">;</span>
        <span class="token keyword">using</span> size_type <span class="token operator">=</span> implementation<span class="token operator">-</span>defined <span class="token punctuation">;</span> <span class="token comment">// see 24.2</span>
        <span class="token keyword">using</span> difference_type <span class="token operator">=</span> implementation<span class="token operator">-</span>defined <span class="token punctuation">;</span> <span class="token comment">// see 24.2</span>
        <span class="token keyword">using</span> iterator <span class="token operator">=</span> implementation<span class="token operator">-</span>defined <span class="token punctuation">;</span> <span class="token comment">// see 24.2</span>
        <span class="token keyword">using</span> const_iterator <span class="token operator">=</span> implementation<span class="token operator">-</span>defined <span class="token punctuation">;</span> <span class="token comment">// see 24.2</span>
        <span class="token keyword">using</span> reverse_iterator <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>reverse_iterator<span class="token operator">&lt;</span>iterator<span class="token operator">&gt;</span><span class="token punctuation">;</span>
        <span class="token keyword">using</span> const_reverse_iterator <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>reverse_iterator<span class="token operator">&lt;</span>const_iterator<span class="token operator">&gt;</span><span class="token punctuation">;</span>

        <span class="token comment">// 24.3.11.2, construct/copy/destroy</span>
        <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">(</span><span class="token keyword">noexcept</span><span class="token punctuation">(</span><span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">:</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span><span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">explicit</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span><span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">explicit</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> value<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">InputIterator</span><span class="token operator">&gt;</span>
        <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>InputIterator first<span class="token punctuation">,</span> InputIterator last<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">template</span><span class="token operator">&lt;</span>container<span class="token operator">-</span>compatible<span class="token operator">-</span>range <span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> R<span class="token operator">&gt;</span>
        <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>from_range_t<span class="token punctuation">,</span> R<span class="token operator">&amp;&amp;</span> rg<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span><span class="token keyword">const</span> non_invalidating_vector<span class="token operator">&amp;</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>non_invalidating_vector<span class="token operator">&amp;&amp;</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span><span class="token keyword">const</span> non_invalidating_vector<span class="token operator">&amp;</span><span class="token punctuation">,</span> <span class="token keyword">const</span> type_identity_t<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token operator">&amp;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>non_invalidating_vector<span class="token operator">&amp;&amp;</span><span class="token punctuation">,</span> <span class="token keyword">const</span> type_identity_t<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token operator">&amp;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>initializer_list<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span><span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token operator">~</span><span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> allocator_type <span class="token function">get_allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

        <span class="token comment">// iterators</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_iterator <span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_iterator <span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> reverse_iterator <span class="token function">rbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reverse_iterator <span class="token function">rbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> reverse_iterator <span class="token function">rend</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reverse_iterator <span class="token function">rend</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

        <span class="token keyword">constexpr</span> const_iterator <span class="token function">cbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_iterator <span class="token function">cend</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reverse_iterator <span class="token function">crbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reverse_iterator <span class="token function">crend</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

        <span class="token comment">// 24.3.11.3, capacity</span>
        <span class="token punctuation">[</span><span class="token punctuation">[</span>nodiscard<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token keyword">constexpr</span> <span class="token keyword">bool</span> <span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> size_type <span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> size_type <span class="token function">max_size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> size_type <span class="token function">capacity</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>

        <span class="token comment">// element access</span>
        <span class="token keyword">constexpr</span> reference <span class="token keyword">operator</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reference <span class="token keyword">operator</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reference <span class="token function">at</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> reference <span class="token function">at</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> reference <span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reference <span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> reference <span class="token function">back</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> const_reference <span class="token function">back</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>

        <span class="token comment">// 24.3.11.4, data access</span>
        <span class="token keyword">constexpr</span> T<span class="token operator">*</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">const</span> T<span class="token operator">*</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">InputIterator</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Allocator</span> <span class="token operator">=</span> allocator<span class="token operator">&lt;</span>iter<span class="token operator">-</span>value<span class="token operator">-</span>type <span class="token operator">&lt;</span>InputIterator<span class="token operator">&gt;&gt;</span><span class="token operator">&gt;</span>
<span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>InputIterator<span class="token punctuation">,</span> InputIterator<span class="token punctuation">,</span> Allocator <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
    <span class="token operator">-&gt;</span> non_invalidating_vector<span class="token operator">&lt;</span>iter<span class="token operator">-</span>value<span class="token operator">-</span>type <span class="token operator">&lt;</span>InputIterator<span class="token operator">&gt;</span><span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span>ranges<span class="token double-colon punctuation">::</span>input_range R<span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Allocator</span> <span class="token operator">=</span> allocator<span class="token operator">&lt;</span>ranges<span class="token double-colon punctuation">::</span>range_value_t<span class="token operator">&lt;</span>R<span class="token operator">&gt;&gt;</span><span class="token operator">&gt;</span>
<span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>from_range_t<span class="token punctuation">,</span> R<span class="token operator">&amp;&amp;</span><span class="token punctuation">,</span> Allocator <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
    <span class="token operator">-&gt;</span> non_invalidating_vector<span class="token operator">&lt;</span>ranges<span class="token double-colon punctuation">::</span>range_value_t<span class="token operator">&lt;</span>R<span class="token operator">&gt;</span><span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><p><ins><sup><span>4</span></sup><span> An incomplete type T may be used when instantiating </span><code>non_invalidating_vector</code><span> if the allocator meets the allocator completeness requirements (16.4.4.6.2). T shall be complete before any member of the resulting specialization of </span><code>non_invalidating_vector</code><span> is referenced.</span></ins></p><h4 id="243112-Constructors-non_invalidating_vectorcons25" data-id="243112-Constructors-non_invalidating_vectorcons"><a class="anchor hidden-xs" href="#243112-Constructors-non_invalidating_vectorcons25" title="243112-Constructors-non_invalidating_vectorcons25"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>24.3.11.2 Constructors [non_invalidating_vector.cons]</span></h4><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> <span class="token keyword">explicit</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span><span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
</code></pre><p><ins><sup><span>1</span></sup><span> </span><em><span>Eﬀects</span></em><span>: Constructs an empty </span><code>non_invalidating_vector</code><span>, using the specifed allocator.</span></ins></p><p><ins><sup><span>2</span></sup><span> </span><em><span>Complexity</span></em><span>: Constant.</span></ins></p><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> <span class="token keyword">explicit</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><ins><sup><span>3</span></sup><span> </span><em><span>Preconditions</span></em><span>: T is </span><code>Cpp17DefaultInsertable</code><span> into </span><code>*this</code><span>.</span></ins></p><p><ins><sup><span>4</span></sup><span> </span><em><span>Eﬀects</span></em><span>: Constructs a </span><code>non_invalidating_vector</code><span> with n default-inserted elements using the specifed allocator.</span></ins></p><p><ins><sup><span>5</span></sup><span> </span><em><span>Complexity</span></em><span>: Linear in n.</span></ins></p><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> value<span class="token punctuation">,</span>
    <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><ins><sup><span>6</span></sup><span> </span><em><span>Preconditions</span></em><span>: T is </span><code>Cpp17CopyInsertable</code><span> into *this.</span></ins></p><p><ins><sup><span>7</span></sup><span> </span><em><span>Eﬀects</span></em><span>: Constructs a </span><code>non_invalidating_vector</code><span> with n copies of value, using the specifed allocator.</span></ins></p><p><ins><sup><span>8</span></sup><span> </span><em><span>Complexity</span></em><span>: Linear in n.</span></ins></p><pre><code class="cpp hljs"><span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">InputIterator</span><span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>InputIterator first<span class="token punctuation">,</span> InputIterator last<span class="token punctuation">,</span>
    <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><ins><sup><span>9</span></sup><span> </span><em><span>Eﬀects</span></em><span>: Constructs a non_invalidating_vector equal to the range </span><code>[first, last)</code><span>, using the specifed allocator.</span></ins></p><p><ins><sup><span>10</span></sup><span> </span><em><span>Complexity</span></em><span>: Makes only N calls to the copy constructor of T (where N is the distance between first and last) and no reallocations if iterators first and last are of forward, bidirectional, or random access categories. It makes order N calls to the copy constructor of T and order log N reallocations if they are just input iterators.</span></ins></p><pre><code class="cpp hljs"><span class="token keyword">template</span><span class="token operator">&lt;</span>container<span class="token operator">-</span>compatible<span class="token operator">-</span>range <span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> R<span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span>from_range_t<span class="token punctuation">,</span> R<span class="token operator">&amp;&amp;</span> rg<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><ins><sup><span>11</span></sup><span> </span><em><span>Eﬀects</span></em><span>: Constructs a </span><code>non_invalidating_vector</code><span> object with the elements of the range </span><code>rg</code><span>, using the specifed allocator.</span></ins></p><p><ins><sup><span>12</span></sup><span> </span><em><span>Complexity</span></em><span>: Initializes exactly N elements from the results of dereferencing successive iterators of </span><code>rg</code><span>, where N is </span><code>ranges::distance(rg)</code><span>. Performs no reallocations if R models ranges::forward_range or </span><code>ranges::sized_range</code><span>; otherwise, performs order log N reallocations and order N calls to the copy or move constructor of T.</span></ins></p><h4 id="243113-Capacity-non_invalidating_vectorcapacity26" data-id="243113-Capacity-non_invalidating_vectorcapacity"><a class="anchor hidden-xs" href="#243113-Capacity-non_invalidating_vectorcapacity26" title="243113-Capacity-non_invalidating_vectorcapacity26"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>24.3.11.3 Capacity [non_invalidating_vector.capacity]</span></h4><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> size_type <span class="token function">capacity</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
</code></pre><p><ins><sup><span>1</span></sup><span> </span><em><span>Returns</span></em><span>: The total number of elements that the </span><code>non_invalidating_vector</code><span> can hold without requiring reallocation.</span></ins></p><p><ins><sup><span>2</span></sup><span> </span><em><span>Complexity</span></em><span>: Constant time.</span></ins></p><h4 id="243114-Data-non_invalidating_vectordata27" data-id="243114-Data-non_invalidating_vectordata"><a class="anchor hidden-xs" href="#243114-Data-non_invalidating_vectordata27" title="243114-Data-non_invalidating_vectordata27"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>24.3.11.4 Data [non_invalidating_vector.data]</span></h4><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> T<span class="token operator">*</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
<span class="token keyword">constexpr</span> <span class="token keyword">const</span> T<span class="token operator">*</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
</code></pre><p><ins><sup><span>1</span></sup><span> </span><em><span>Returns</span></em><span>: A pointer such that </span><code>[data(), data() + size())</code><span> is a valid range. For a non-empty </span><code>non_invalidating_vector</code><span>, </span><code>data() == addressof(front())</code><span> is </span><code>true</code><span>.</span></ins></p><p><ins><sup><span>2</span></sup><span> </span><em><span>Complexity</span></em><span>: Constant time.</span></ins></p><h3 id="24311-Class-template-vector-vector" data-id="24311-Class-template-vector-vector"><a class="anchor hidden-xs" href="#24311-Class-template-vector-vector" title="24311-Class-template-vector-vector"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>24.3.11 Class template vector [vector]</span></h3><h4 id="243111-Overview-vectoroverview" data-id="243111-Overview-vectoroverview"><a class="anchor hidden-xs" href="#243111-Overview-vectoroverview" title="243111-Overview-vectoroverview"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>24.3.11.1 Overview [vector.overview]</span></h4><p><sup><span>1</span></sup><span> A </span><code>vector</code><span> is a sequence container that supports (amortized) constant time </span><code>insert</code><span> and </span><code>erase</code><span> operations at the end; </span><code>insert</code><span> and </span><code>erase</code><span> in the middle take linear time. Storage management is handled automatically, though hints can be given to improve efficiency.</span></p><p><sup><span>2</span></sup><span> A </span><code>vector</code><span> meets all of the requirements of a container (24.2.2.2), of a reversible container (24.2.2.3), of an allocator-aware container (24.2.2.5), of a sequence container, including most of the optional sequence container requirements (24.2.4), and, for an element type other than </span><code>bool</code><span>, of a contiguous container (24.2.2.2). The exceptions are the </span><code>push_front</code><span>, </span><code>prepend_range</code><span>, </span><code>pop_front</code><span>, and </span><code>emplace_front</code><span> member functions, which are not provided. Descriptions are provided here only for operations on </span><code>vector</code><span> that are not described in one of these tables or for operations where there is additional semantic information.</span></p><p><sup><span>3</span></sup><span> The types </span><code>iterator</code><span> and </span><code>const_iterator</code><span> meet the constexpr iterator requirements (25.3.1).</span></p><pre><code class="cpp hljs"><span class="token keyword">namespace</span> std <span class="token punctuation">{</span>
    <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">T</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Allocator</span> <span class="token operator">=</span> allocator<span class="token operator">&lt;</span>T<span class="token operator">&gt;&gt;</span>
    <span class="token keyword">class</span> <span class="token class-name">vector</span> <span class="token operator">:</span> <span class="token base-clause"><span class="token keyword">public</span> <span class="token class-name">non_invalidating_vector</span></span> <span class="token punctuation">{</span>
    <span class="token keyword">public</span><span class="token operator">:</span>
        <span class="token comment">// 24.3.11.2, construct/copy/destroy</span>
        <span class="token keyword">constexpr</span> <span class="token function">vector</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">(</span><span class="token keyword">noexcept</span><span class="token punctuation">(</span><span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">:</span> <span class="token function">vector</span><span class="token punctuation">(</span><span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span>
        <span class="token keyword">constexpr</span> <span class="token function">vector</span><span class="token punctuation">(</span><span class="token keyword">const</span> vector<span class="token operator">&amp;</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token function">vector</span><span class="token punctuation">(</span>vector<span class="token operator">&amp;&amp;</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token function">vector</span><span class="token punctuation">(</span><span class="token keyword">const</span> vector<span class="token operator">&amp;</span><span class="token punctuation">,</span> <span class="token keyword">const</span> type_identity_t<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token operator">&amp;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token function">vector</span><span class="token punctuation">(</span>vector<span class="token operator">&amp;&amp;</span><span class="token punctuation">,</span> <span class="token keyword">const</span> type_identity_t<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token operator">&amp;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">using</span> non_invalidating_vector<span class="token double-colon punctuation">::</span>non_invalidating_vector<span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token operator">~</span><span class="token function">vector</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> vector<span class="token operator">&amp;</span> <span class="token keyword">operator</span><span class="token operator">=</span><span class="token punctuation">(</span><span class="token keyword">const</span> vector<span class="token operator">&amp;</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> vector<span class="token operator">&amp;</span> <span class="token keyword">operator</span><span class="token operator">=</span><span class="token punctuation">(</span>vector<span class="token operator">&amp;&amp;</span> x<span class="token punctuation">)</span>
            <span class="token keyword">noexcept</span><span class="token punctuation">(</span>allocator_traits<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>propagate_on_container_move_assignment<span class="token double-colon punctuation">::</span>value <span class="token operator">||</span>
            allocator_traits<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>is_always_equal<span class="token double-colon punctuation">::</span>value<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> vector<span class="token operator">&amp;</span> <span class="token keyword">operator</span><span class="token operator">=</span><span class="token punctuation">(</span>initializer_list<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">InputIterator</span><span class="token operator">&gt;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">assign</span><span class="token punctuation">(</span>InputIterator first<span class="token punctuation">,</span> InputIterator last<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">template</span><span class="token operator">&lt;</span>container<span class="token operator">-</span>compatible<span class="token operator">-</span>range <span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> R<span class="token operator">&gt;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">assign_range</span><span class="token punctuation">(</span>R<span class="token operator">&amp;&amp;</span> rg<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">assign</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> u<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">assign</span><span class="token punctuation">(</span>initializer_list<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token comment">// 24.3.11.3, capacity</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">resize</span><span class="token punctuation">(</span>size_type sz<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">resize</span><span class="token punctuation">(</span>size_type sz<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> c<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">reserve</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">shrink_to_fit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token comment">// 24.3.11.5, modifers</span>
        <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> Args<span class="token operator">&gt;</span> <span class="token keyword">constexpr</span> reference <span class="token function">emplace_back</span><span class="token punctuation">(</span>Args<span class="token operator">&amp;&amp;</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> args<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">push_back</span><span class="token punctuation">(</span><span class="token keyword">const</span> T<span class="token operator">&amp;</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">push_back</span><span class="token punctuation">(</span>T<span class="token operator">&amp;&amp;</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">template</span><span class="token operator">&lt;</span>container<span class="token operator">-</span>compatible<span class="token operator">-</span>range <span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> R<span class="token operator">&gt;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">append_range</span><span class="token punctuation">(</span>R<span class="token operator">&amp;&amp;</span> rg<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">pop_back</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> Args<span class="token operator">&gt;</span> <span class="token keyword">constexpr</span> iterator <span class="token function">emplace</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> Args<span class="token operator">&amp;&amp;</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> args<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> T<span class="token operator">&amp;&amp;</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> size_type n<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">InputIterator</span><span class="token operator">&gt;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span>
            InputIterator first<span class="token punctuation">,</span> InputIterator last<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">template</span><span class="token operator">&lt;</span>container<span class="token operator">-</span>compatible<span class="token operator">-</span>range <span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> R<span class="token operator">&gt;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">insert_range</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> R<span class="token operator">&amp;&amp;</span> rg<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> initializer_list<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> il<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">erase</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> iterator <span class="token function">erase</span><span class="token punctuation">(</span>const_iterator first<span class="token punctuation">,</span> const_iterator last<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">swap</span><span class="token punctuation">(</span>vector<span class="token operator">&amp;</span><span class="token punctuation">)</span>
            <span class="token keyword">noexcept</span><span class="token punctuation">(</span>allocator_traits<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>propagate_on_container_swap<span class="token double-colon punctuation">::</span>value <span class="token operator">||</span>
            allocator_traits<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>is_always_equal<span class="token double-colon punctuation">::</span>value<span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">clear</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">InputIterator</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Allocator</span> <span class="token operator">=</span> allocator<span class="token operator">&lt;</span>iter<span class="token operator">-</span>value<span class="token operator">-</span>type <span class="token operator">&lt;</span>InputIterator<span class="token operator">&gt;&gt;</span><span class="token operator">&gt;</span>
<span class="token function">vector</span><span class="token punctuation">(</span>InputIterator<span class="token punctuation">,</span> InputIterator<span class="token punctuation">,</span> Allocator <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
    <span class="token operator">-&gt;</span> vector<span class="token operator">&lt;</span>iter<span class="token operator">-</span>value<span class="token operator">-</span>type <span class="token operator">&lt;</span>InputIterator<span class="token operator">&gt;</span><span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span>ranges<span class="token double-colon punctuation">::</span>input_range R<span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Allocator</span> <span class="token operator">=</span> allocator<span class="token operator">&lt;</span>ranges<span class="token double-colon punctuation">::</span>range_value_t<span class="token operator">&lt;</span>R<span class="token operator">&gt;&gt;</span><span class="token operator">&gt;</span>
<span class="token function">vector</span><span class="token punctuation">(</span>from_range_t<span class="token punctuation">,</span> R<span class="token operator">&amp;&amp;</span><span class="token punctuation">,</span> Allocator <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
    <span class="token operator">-&gt;</span> vector<span class="token operator">&lt;</span>ranges<span class="token double-colon punctuation">::</span>range_value_t<span class="token operator">&lt;</span>R<span class="token operator">&gt;</span><span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><p><sup><span>4</span></sup><span> An incomplete type T may be used when instantiating </span><code>vector</code><span> if the allocator meets the allocator completeness requirements (16.4.4.6.2). T shall be complete before any member of the resulting specialization of </span><code>vector</code><span> is referenced.</span></p><h4 id="243112-Constructors-vectorcons" data-id="243112-Constructors-vectorcons"><a class="anchor hidden-xs" href="#243112-Constructors-vectorcons" title="243112-Constructors-vectorcons"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>24.3.11.2 Constructors [vector.cons]</span></h4><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> <span class="token keyword">explicit</span> <span class="token function">vector</span><span class="token punctuation">(</span><span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
</code></pre><p><s><sup><span>1</span></sup><span> </span><em><span>Eﬀects</span></em><span>: Constructs an empty </span><code>vector</code><span>, using the specifed allocator.</span></s></p><p><s><sup><span>2</span></sup><span> </span><em><span>Complexity</span></em><span>: Constant.</span></s></p><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> <span class="token keyword">explicit</span> <span class="token function">vector</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><s><sup><span>3</span></sup><span> </span><em><span>Preconditions</span></em><span>: T is </span><code>Cpp17DefaultInsertable</code><span> into </span><code>*this</code><span>.</span></s></p><p><s><sup><span>4</span></sup><span> </span><em><span>Eﬀects</span></em><span>: Constructs a </span><code>vector</code><span> with n default-inserted elements using the specifed allocator.</span></s></p><p><s><sup><span>5</span></sup><span> </span><em><span>Complexity</span></em><span> Linear in n.</span></s></p><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> <span class="token function">vector</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> value<span class="token punctuation">,</span>
    <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><s><sup><span>6</span></sup><span> </span><em><span>Preconditions</span></em><span>: T is </span><code>Cpp17CopyInsertable</code><span> into </span><code>*this</code><span>.</span></s></p><p><s><sup><span>7</span></sup><span> </span><em><span>Eﬀects</span></em><span>: Constructs a </span><code>vector</code><span> with n copies of value, using the specifed allocator.</span></s></p><p><s><sup><span>8</span></sup><span> </span><em><span>Complexity</span></em><span>: Linear in n.</span></s></p><pre><code class="cpp hljs"><span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">InputIterator</span><span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> <span class="token function">vector</span><span class="token punctuation">(</span>InputIterator first<span class="token punctuation">,</span> InputIterator last<span class="token punctuation">,</span>
    <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><s><sup><span>9</span></sup><span> </span><em><span>Eﬀects</span></em><span>: Constructs a </span><code>vector</code><span> equal to the range [</span><code>first</code><span>, </span><code>last</code><span>), using the specifed allocator.</span></s></p><p><s><sup><span>10</span></sup><span> </span><em><span>Complexity</span></em><span>: Makes only N calls to the copy constructor of T (where N is the distance between </span><code>first</code><span> and </span><code>last</code><span>) and no reallocations if iterators </span><code>first</code><span> and </span><code>last</code><span> are of forward, bidirectional, or random access categories. It makes order N calls to the copy constructor of T and order log N reallocations if they are just input iterators.</span></s></p><pre><code class="cpp hljs"><span class="token keyword">template</span><span class="token operator">&lt;</span>container<span class="token operator">-</span>compatible<span class="token operator">-</span>range <span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> R<span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> <span class="token function">vector</span><span class="token punctuation">(</span>from_range_t<span class="token punctuation">,</span> R<span class="token operator">&amp;&amp;</span> rg<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><sup><span>11</span></sup><span> </span><em><span>Eﬀects</span></em><span>: Constructs a </span><code>vector</code><span> object with the elements of the range </span><code>rg</code><span>, using the specifed allocator.</span></p><p><sup><span>12</span></sup><span> </span><em><span>Complexity</span></em><span>: Initializes exactly N elements from the results of dereferencing successive iterators of </span><code>rg</code><span>, where N is </span><code>ranges::distance(rg)</code><span>. Performs no reallocations if R models </span><code>ranges::forward_range</code><span> or </span><code>ranges::sized_range</code><span>; otherwise, performs order log N reallocations and order N calls to the copy or move constructor of T.</span></p><p><ins><code>vector</code><span> inherits the constructors of </span><code>non_invalidating_vector</code><span>.</span></ins></p><h4 id="243113-Capacity-vectorcapacity" data-id="243113-Capacity-vectorcapacity"><a class="anchor hidden-xs" href="#243113-Capacity-vectorcapacity" title="243113-Capacity-vectorcapacity"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>24.3.11.3 Capacity [vector.capacity]</span></h4><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> size_type <span class="token function">capacity</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
</code></pre><p><s><sup><span>1</span></sup><span> </span><em><span>Returns</span></em><span>: The total number of elements that the </span><code>vector</code><span> can hold without requiring reallocation.</span></s></p><p><s><sup><span>2</span></sup><span> </span><em><span>Complexity</span></em><span>: Constant time.</span></s></p><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">reserve</span><span class="token punctuation">(</span>size_type n<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><sup><s><span>3</span></s><ins><span>1</span></ins></sup><span> </span><em><span>Preconditions</span></em><span>: T is </span><code>Cpp17MoveInsertable</code><span> into *this.</span></p><p><sup><s><span>4</span></s><ins><span>2</span></ins></sup><span> </span><em><span>Eﬀects</span></em><span>: A directive that informs a vector of a planned change in size, so that it can manage the storage allocation accordingly. After </span><code>reserve()</code><span>, </span><code>capacity()</code><span> is greater or equal to the argument of reserve if reallocation happens; and equal to the previous value of </span><code>capacity()</code><span> otherwise. Reallocation happens at this point if and only if the current capacity is less than the argument of </span><code>reserve()</code><span>. If an exception is thrown other than by the move constructor of a non-</span><code>Cpp17CopyInsertable</code><span> type, there are no eﬀects.</span></p><p><sup><s><span>5</span></s><ins><span>3</span></ins></sup><span> </span><em><span>Throws</span></em><span>: length_error if </span><code>n &gt; max_size()</code><span>.</span><sup><span>207</span></sup></p><p><sup><s><span>6</span></s><ins><span>4</span></ins></sup><span> </span><em><span>Complexity</span></em><span>: It does not change the size of the sequence and takes at most linear time in the size of the sequence.</span></p><p><sup><s><span>7</span></s><ins><span>5</span></ins></sup><span> </span><em><span>Remarks</span></em><span>: Reallocation invalidates all the references, pointers, and iterators referring to the elements in the sequence, as well as the past-the-end iterator.</span></p><p><span>[</span><em><span>Note 1</span></em><span>: If no reallocation happens, they remain valid. — </span><em><span>end note</span></em><span>]</span></p><p><span>No reallocation shall take place during insertions that happen after a call to </span><code>reserve()</code><span> until an insertion would make the size of the </span><code>vector</code><span> greater than the value of </span><code>capacity()</code><span>.</span></p><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">shrink_to_fit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><sup><s><span>8</span></s><ins><span>6</span></ins></sup><span> </span><em><span>Preconditions</span></em><span>: T is </span><code>Cpp17MoveInsertable</code><span> into *this.</span></p><p><sup><s><span>9</span></s><ins><span>7</span></ins></sup><span> </span><em><span>Eﬀects</span></em><span>: shrink_to_fit is a non-binding request to reduce </span><code>capacity()</code><span> to </span><code>size()</code><span>.</span></p><p><span>[</span><em><span>Note 2</span></em><span>: The request is non-binding to allow latitude for implementation-specifc optimizations. — </span><em><span>end note</span></em><span>]</span></p><p><span>It does not increase </span><code>capacity()</code><span>, but may reduce </span><code>capacity()</code><span> by causing reallocation. If an exception is thrown other than by the move constructor of a non-</span><code>Cpp17CopyInsertable</code><span> T there are no eﬀects.</span></p><p><sup><s><span>10</span></s><ins><span>8</span></ins></sup><span> </span><em><span>Complexity</span></em><span>: If reallocation happens, linear in the size of the sequence.</span></p><p><sup><s><span>11</span></s><ins><span>9</span></ins></sup><span> </span><em><span>Remarks</span></em><span>: Reallocation invalidates all the references, pointers, and iterators referring to the elements in the sequence as well as the past-the-end iterator.</span></p><p><span>[</span><em><span>Note 3</span></em><span>: If no reallocation happens, they remain valid. — </span><em><span>end note</span></em><span>]</span></p><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">swap</span><span class="token punctuation">(</span>vector<span class="token operator">&amp;</span> x<span class="token punctuation">)</span>
<span class="token keyword">noexcept</span><span class="token punctuation">(</span>allocator_traits<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>propagate_on_container_swap<span class="token double-colon punctuation">::</span>value <span class="token operator">||</span>
    allocator_traits<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>is_always_equal<span class="token double-colon punctuation">::</span>value<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><sup><s><span>12</span></s><ins><span>10</span></ins></sup><span> </span><em><span>Eﬀects</span></em><span>: Exchanges the contents and </span><code>capacity()</code><span> of </span><code>*this</code><span> with that of x.</span></p><p><sup><s><span>13</span></s><ins><span>11</span></ins></sup><span> </span><em><span>Complexity</span></em><span>: Constant time.</span></p><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">resize</span><span class="token punctuation">(</span>size_type sz<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><sup><s><span>14</span></s><ins><span>12</span></ins></sup><span> </span><em><span>Preconditions</span></em><span>: T is </span><code>Cpp17MoveInsertable</code><span> and </span><code>Cpp17DefaultInsertable</code><span> into </span><code>*this</code><span>.</span></p><p><sup><s><span>15</span></s><ins><span>13</span></ins></sup><span> </span><em><span>Eﬀects</span></em><span>: If </span><code>sz &lt; size()</code><span>, erases the last </span><code>size() - sz</code><span> elements from the sequence. Otherwise, appends </span><code>sz - size()</code><span> default-inserted elements to the sequence.</span></p><p><sup><s><span>16</span></s><ins><span>14</span></ins></sup><span> </span><em><span>Remarks</span></em><span>: If an exception is thrown other than by the move constructor of a non-</span><code>Cpp17CopyInsertable</code><span> T there are no eﬀects.</span></p><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">resize</span><span class="token punctuation">(</span>size_type sz<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> c<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><sup><s><span>17</span></s><ins><span>15</span></ins></sup><span> </span><em><span>Preconditions</span></em><span>: T is </span><code>Cpp17CopyInsertable</code><span> into *this.</span></p><p><sup><s><span>18</span></s><ins><span>16</span></ins></sup><span> </span><em><span>Eﬀects</span></em><span>: If </span><code>sz &lt; size()</code><span>, erases the last </span><code>size() - sz</code><span> elements from the sequence. Otherwise, appends </span><code>sz - size()</code><span> copies of c to the sequence.</span></p><p><sup><s><span>19</span></s><ins><span>17</span></ins></sup><span> </span><em><span>Remarks</span></em><span>: If an exception is thrown there are no eﬀects.</span></p><h4 id="243114-Data-vectordata" data-id="243114-Data-vectordata"><a class="anchor hidden-xs" href="#243114-Data-vectordata" title="243114-Data-vectordata"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><s><span>24.3.11.4 Data [vector.data]</span></s></h4><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> T<span class="token operator">*</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
<span class="token keyword">constexpr</span> <span class="token keyword">const</span> T<span class="token operator">*</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span><span class="token punctuation">;</span>
</code></pre><p><s><sup><span>1</span></sup><span> </span><em><span>Returns</span></em><span>: A pointer such that </span><code>[data(), data() + size())</code><span> is a valid range. For a non-empty vector, </span><code>data() == addressof(front())</code><span> is true.</span></s></p><p><s><sup><span>2</span></sup><span> </span><em><span>Complexity</span></em><span>: Constant time.</span></s></p><hr><p><s><span>207) </span><code>reserve()</code><span> uses </span><code>Allocator::allocate()</code><span> which can throw an appropriate exception.</span></s></p><h4 id="2431154-Modifers-vectormodifers" data-id="2431154-Modifers-vectormodifers"><a class="anchor hidden-xs" href="#2431154-Modifers-vectormodifers" title="2431154-Modifers-vectormodifers"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>24.3.11.</span><s><span>5</span></s><ins><span>4</span></ins><span> Modifers [vector.modifers]</span></h4><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> T<span class="token operator">&amp;&amp;</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> size_type n<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">InputIterator</span><span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> InputIterator first<span class="token punctuation">,</span> InputIterator last<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">template</span><span class="token operator">&lt;</span>container<span class="token operator">-</span>compatible<span class="token operator">-</span>range <span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> R<span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> iterator <span class="token function">insert_range</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> R<span class="token operator">&amp;&amp;</span> rg<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> initializer_list<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> Args<span class="token operator">&gt;</span> <span class="token keyword">constexpr</span> reference <span class="token function">emplace_back</span><span class="token punctuation">(</span>Args<span class="token operator">&amp;&amp;</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> args<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> Args<span class="token operator">&gt;</span> <span class="token keyword">constexpr</span> iterator <span class="token function">emplace</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">,</span> Args<span class="token operator">&amp;&amp;</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> args<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">push_back</span><span class="token punctuation">(</span><span class="token keyword">const</span> T<span class="token operator">&amp;</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">push_back</span><span class="token punctuation">(</span>T<span class="token operator">&amp;&amp;</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">template</span><span class="token operator">&lt;</span>container<span class="token operator">-</span>compatible<span class="token operator">-</span>range <span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> R<span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">append_range</span><span class="token punctuation">(</span>R<span class="token operator">&amp;&amp;</span> rg<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><sup><span>1</span></sup><span> </span><em><span>Complexity</span></em><span>: If reallocation happens, linear in the number of elements of the resulting vector; otherwise, linear in the number of elements inserted plus the distance to the end of the </span><code>vector</code><span>.</span></p><p><sup><span>2</span></sup><span> </span><em><span>Remarks</span></em><span>: Causes reallocation if the new size is greater than the old capacity. Reallocation invalidates all the references, pointers, and iterators referring to the elements in the sequence, as well as the pastthe-end iterator. If no reallocation happens, then references, pointers, and iterators before the insertion point remain valid but those at or after the insertion point, including the past-the-end iterator, are invalidated. If an exception is thrown other than by the copy constructor, move constructor, assignment operator, or move assignment operator of T or by any InputIterator operation there are no eﬀects. If an exception is thrown while inserting a single element at the end and T is </span><code>Cpp17CopyInsertable</code><span> or </span><code>is_nothrow_move_constructible_v&lt;T&gt;</code><span> is true, there are no eﬀects. Otherwise, if an exception is thrown by the move constructor of a non-</span><code>Cpp17CopyInsertable</code><span> T, the eﬀects are unspecifed.</span></p><pre><code class="cpp hljs"><span class="token keyword">constexpr</span> iterator <span class="token function">erase</span><span class="token punctuation">(</span>const_iterator position<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">constexpr</span> iterator <span class="token function">erase</span><span class="token punctuation">(</span>const_iterator first<span class="token punctuation">,</span> const_iterator last<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">pop_back</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><sup><span>3</span></sup><span> </span><em><span>Eﬀects</span></em><span>: Invalidates iterators and references at or after the point of the erase.</span></p><p><sup><span>4</span></sup><span> </span><em><span>Throws</span></em><span>: Nothing unless an exception is thrown by the assignment operator or move assignment operator of T.</span></p><p><sup><span>5</span></sup><span> </span><em><span>Complexity</span></em><span>: The destructor of T is called the number of times equal to the number of the elements erased, but the assignment operator of T is called the number of times equal to the number of elements in the </span><code>vector</code><span> after the erased elements.</span></p><h3 id="2431165-Erasure-vectorerasure" data-id="2431165-Erasure-vectorerasure"><a class="anchor hidden-xs" href="#2431165-Erasure-vectorerasure" title="2431165-Erasure-vectorerasure"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>24.3.11.</span><s><span>6</span></s><ins><span>5</span></ins><span> Erasure [vector.erasure]</span></h3><pre><code class="cpp hljs"><span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">T</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Allocator</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">U</span> <span class="token operator">=</span> T<span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> <span class="token keyword">typename</span> <span class="token class-name">vector</span><span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>size_type
<span class="token function">erase</span><span class="token punctuation">(</span>vector<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span><span class="token operator">&amp;</span> c<span class="token punctuation">,</span> <span class="token keyword">const</span> U<span class="token operator">&amp;</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><sup><span>1</span></sup><span> </span><em><span>Effects</span></em><span>: Equivalent to:</span></p><pre><code class="cpp hljs"><span class="token keyword">auto</span> it <span class="token operator">=</span> <span class="token function">remove</span><span class="token punctuation">(</span>c<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> c<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">auto</span> r <span class="token operator">=</span> <span class="token function">distance</span><span class="token punctuation">(</span>it<span class="token punctuation">,</span> c<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
c<span class="token punctuation">.</span><span class="token function">erase</span><span class="token punctuation">(</span>it<span class="token punctuation">,</span> c<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> r<span class="token punctuation">;</span>
</code></pre><pre><code class="cpp hljs"><span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">class</span> <span class="token class-name">T</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Allocator</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Predicate</span><span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> <span class="token keyword">typename</span> <span class="token class-name">vector</span><span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>size_type
<span class="token function">erase_if</span><span class="token punctuation">(</span>vector<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span><span class="token operator">&amp;</span> c<span class="token punctuation">,</span> Predicate pred<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p><sup><span>2</span></sup><span> </span><em><span>Effects</span></em><span>: Equivalent to:</span></p><pre><code class="cpp hljs"><span class="token keyword">auto</span> it <span class="token operator">=</span> <span class="token function">remove_if</span><span class="token punctuation">(</span>c<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> c<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> pred<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">auto</span> r <span class="token operator">=</span> <span class="token function">distance</span><span class="token punctuation">(</span>it<span class="token punctuation">,</span> c<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
c<span class="token punctuation">.</span><span class="token function">erase</span><span class="token punctuation">(</span>it<span class="token punctuation">,</span> c<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> r<span class="token punctuation">;</span>
</code></pre><h3 id="Feature-test-macro-versionsyn" data-id="Feature-test-macro-versionsyn"><a class="anchor hidden-xs" href="#Feature-test-macro-versionsyn" title="Feature-test-macro-versionsyn"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>Feature-test macro [version.syn]</span></h3><p><span>Add the following macro definition to [version.syn], header </span>&lt;version&gt;<span> synopsis, with the value selected by the editor to reflect the date of adoption of this paper:</span></p><pre><code class="cpp hljs"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">__cpp_lib_non_invalidating_vector</span> <span class="token expression"><span class="token number">20</span>XXXXL </span><span class="token comment">// also in &lt;ranges&gt;, &lt;tuple&gt;, &lt;utility&gt;</span></span>
</code></pre><h2 id="Impact-on-the-standard" data-id="Impact-on-the-standard"><a class="anchor hidden-xs" href="#Impact-on-the-standard" title="Impact-on-the-standard"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>Impact on the standard</span></h2><p><span>The non alternative is a pure library extension, affecting no other parts of the library or language.</span></p><p><span>The better inheritance based alternative is a refactor of the </span><code>std::vector</code><span> moving some of its methods into a new base class. It does not effect other parts of the library or language. As </span><code>std::vector</code><span> won't be losing any functionality than this is not expected to be a breaking change for users of </span><code>std::vector</code><span>.</span></p><p><span>The proposed changes are relative to the current working draft </span><code>N4981</code><span> </span><sup class="footnote-ref"><a href="#fn4" id="fnref4">[4]</a></sup><span>.</span></p><h2 id="Implementation" data-id="Implementation"><a class="anchor hidden-xs" href="#Implementation" title="Implementation"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>Implementation</span></h2><pre><code class="cpp hljs"><span class="token keyword">template</span><span class="token operator">&lt;</span>
    <span class="token keyword">class</span> <span class="token class-name">T</span><span class="token punctuation">,</span>
    <span class="token keyword">class</span> <span class="token class-name">Allocator</span> <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>allocator<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span>
<span class="token operator">&gt;</span>
<span class="token keyword">class</span> <span class="token class-name">non_invalidating_vector_ref</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span><span class="token operator">:</span>
    <span class="token comment">// Member types</span>
    <span class="token keyword">typedef</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span> actual_type<span class="token punctuation">;</span>

    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>value_type value_type<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>allocator_type allocator_type<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>size_type size_type<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>difference_type difference_type<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>reference reference<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>const_reference const_reference<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>pointer pointer<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>const_pointer const_pointer<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>iterator iterator<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>const_iterator const_iterator<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>reverse_iterator reverse_iterator<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>const_reverse_iterator const_reverse_iterator<span class="token punctuation">;</span>
<span class="token keyword">private</span><span class="token operator">:</span>
    actual_type<span class="token operator">&amp;</span> ref<span class="token punctuation">;</span>
<span class="token keyword">public</span><span class="token operator">:</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector_ref</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector_ref</span><span class="token punctuation">(</span><span class="token keyword">const</span> non_invalidating_vector_ref<span class="token operator">&amp;</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">default</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector_ref</span><span class="token punctuation">(</span>non_invalidating_vector_ref<span class="token operator">&amp;&amp;</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">default</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> non_invalidating_vector_ref <span class="token keyword">operator</span><span class="token operator">=</span><span class="token punctuation">(</span><span class="token keyword">const</span> non_invalidating_vector_ref<span class="token operator">&amp;</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> non_invalidating_vector_ref <span class="token keyword">operator</span><span class="token operator">=</span><span class="token punctuation">(</span><span class="token keyword">const</span> non_invalidating_vector_ref<span class="token operator">&amp;&amp;</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>

    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector_ref</span><span class="token punctuation">(</span>actual_type<span class="token operator">&amp;</span> reference<span class="token punctuation">)</span> <span class="token operator">:</span> ref<span class="token punctuation">{</span>reference<span class="token punctuation">}</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>

    <span class="token comment">//constexpr non_invalidating_vector_ref&amp; operator=( const non_invalidating_vector_ref&amp; other ) = delete;</span>
    non_invalidating_vector_ref<span class="token operator">&amp;</span> <span class="token keyword">operator</span><span class="token operator">=</span><span class="token punctuation">(</span> non_invalidating_vector_ref<span class="token operator">&amp;&amp;</span> other <span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>allocator_traits<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>propagate_on_container_move_assignment<span class="token double-colon punctuation">::</span>value <span class="token operator">||</span> std<span class="token double-colon punctuation">::</span>allocator_traits<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>is_always_equal<span class="token double-colon punctuation">::</span>value<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> non_invalidating_vector_ref<span class="token operator">&amp;</span> <span class="token keyword">operator</span><span class="token operator">=</span><span class="token punctuation">(</span> std<span class="token double-colon punctuation">::</span>initializer_list<span class="token operator">&lt;</span>value_type<span class="token operator">&gt;</span> ilist <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">assign</span><span class="token punctuation">(</span> size_type count<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> value <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span> <span class="token class-name">InputIt</span> <span class="token operator">&gt;</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">assign</span><span class="token punctuation">(</span> InputIt first<span class="token punctuation">,</span> InputIt last <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">assign</span><span class="token punctuation">(</span> std<span class="token double-colon punctuation">::</span>initializer_list<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> ilist <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span> <span class="token class-name">R</span> <span class="token operator">&gt;</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">assign_range</span><span class="token punctuation">(</span> R<span class="token operator">&amp;&amp;</span> rg <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> allocator_type <span class="token function">get_allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">get_allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">// Element access</span>
    <span class="token keyword">constexpr</span> reference <span class="token function">at</span><span class="token punctuation">(</span> size_type pos <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">at</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_reference <span class="token function">at</span><span class="token punctuation">(</span> size_type pos <span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">at</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> reference <span class="token keyword">operator</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span> size_type pos <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">[</span>pos<span class="token punctuation">]</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_reference <span class="token keyword">operator</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span> size_type pos <span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">[</span>pos<span class="token punctuation">]</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> reference <span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_reference <span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> reference <span class="token function">back</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">back</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_reference <span class="token function">back</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">back</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> T<span class="token operator">*</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">const</span> T<span class="token operator">*</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">// Iterators</span>
    <span class="token keyword">constexpr</span> iterator <span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_iterator <span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_iterator <span class="token function">cbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">cbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> iterator <span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_iterator <span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_iterator <span class="token function">cend</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">cend</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> reverse_iterator <span class="token function">rbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">rbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_reverse_iterator <span class="token function">rbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">rbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_reverse_iterator <span class="token function">crbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">crbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> reverse_iterator <span class="token function">rend</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">rend</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_reverse_iterator <span class="token function">rend</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">rend</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_reverse_iterator <span class="token function">crend</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">crend</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">// Capacity</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">bool</span> <span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> size_type <span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> size_type <span class="token function">max_size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">max_size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> size_type <span class="token function">capacity</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">.</span><span class="token function">capacity</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">void</span> <span class="token function">shrink_to_fit</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token comment">// Modifiers</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">clear</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span> const_iterator pos<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> value <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span> const_iterator pos<span class="token punctuation">,</span> T<span class="token operator">&amp;&amp;</span> value <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span> const_iterator pos<span class="token punctuation">,</span> size_type count<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> value <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span> <span class="token class-name">InputIt</span> <span class="token operator">&gt;</span>
    <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span> const_iterator pos<span class="token punctuation">,</span> InputIt first<span class="token punctuation">,</span> InputIt last <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span> const_iterator pos<span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span>initializer_list<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> ilist <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span> <span class="token class-name">R</span> <span class="token operator">&gt;</span>
    <span class="token keyword">constexpr</span> iterator <span class="token function">insert_range</span><span class="token punctuation">(</span> const_iterator pos<span class="token punctuation">,</span> R<span class="token operator">&amp;&amp;</span> rg <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> Args <span class="token operator">&gt;</span>
    <span class="token keyword">constexpr</span> iterator <span class="token function">emplace</span><span class="token punctuation">(</span> const_iterator pos<span class="token punctuation">,</span> Args<span class="token operator">&amp;&amp;</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> args <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> iterator <span class="token function">erase</span><span class="token punctuation">(</span> const_iterator pos <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> iterator <span class="token function">erase</span><span class="token punctuation">(</span> const_iterator first<span class="token punctuation">,</span> const_iterator last <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">push_back</span><span class="token punctuation">(</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> value <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">push_back</span><span class="token punctuation">(</span> T<span class="token operator">&amp;&amp;</span> value <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> Args <span class="token operator">&gt;</span>
    <span class="token keyword">constexpr</span> reference <span class="token function">emplace_back</span><span class="token punctuation">(</span> Args<span class="token operator">&amp;&amp;</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> args <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span> <span class="token class-name">R</span> <span class="token operator">&gt;</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">append_range</span><span class="token punctuation">(</span> R<span class="token operator">&amp;&amp;</span> rg <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">pop_back</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">resize</span><span class="token punctuation">(</span> size_type count <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">resize</span><span class="token punctuation">(</span> size_type count<span class="token punctuation">,</span> <span class="token keyword">const</span> value_type<span class="token operator">&amp;</span> value <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">swap</span><span class="token punctuation">(</span> actual_type<span class="token operator">&amp;</span> other <span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>allocator_traits<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>propagate_on_container_swap<span class="token double-colon punctuation">::</span>value <span class="token operator">||</span> std<span class="token double-colon punctuation">::</span>allocator_traits<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>is_always_equal<span class="token double-colon punctuation">::</span>value<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>

    <span class="token keyword">operator</span> <span class="token keyword">const</span> actual_type<span class="token operator">&amp;</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> ref<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span> <span class="token class-name">T</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Alloc</span> <span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> <span class="token keyword">bool</span> <span class="token keyword">operator</span><span class="token operator">==</span><span class="token punctuation">(</span> <span class="token keyword">const</span> non_invalidating_vector_ref<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Alloc<span class="token operator">&gt;</span><span class="token operator">&amp;</span> lhs<span class="token punctuation">,</span>
                 <span class="token keyword">const</span> non_invalidating_vector_ref<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Alloc<span class="token operator">&gt;</span><span class="token operator">&amp;</span> rhs <span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">return</span> lhs<span class="token punctuation">.</span>ref <span class="token operator">==</span> rhs<span class="token punctuation">.</span>ref<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span> <span class="token class-name">T</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Alloc</span> <span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> <span class="token keyword">auto</span><span class="token comment">/*std::synth-three-way-result&lt;T&gt;*/</span>
    <span class="token keyword">operator</span><span class="token operator">&lt;=&gt;</span><span class="token punctuation">(</span> <span class="token keyword">const</span> non_invalidating_vector_ref<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Alloc<span class="token operator">&gt;</span><span class="token operator">&amp;</span> lhs<span class="token punctuation">,</span>
                 <span class="token keyword">const</span> non_invalidating_vector_ref<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Alloc<span class="token operator">&gt;</span><span class="token operator">&amp;</span> rhs <span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">return</span> lhs<span class="token punctuation">.</span>ref <span class="token operator">&lt;=&gt;</span> rhs<span class="token punctuation">.</span>ref<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span> <span class="token class-name">T</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Alloc</span> <span class="token operator">&gt;</span>
<span class="token keyword">void</span> <span class="token function">swap</span><span class="token punctuation">(</span> non_invalidating_vector_ref<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Alloc<span class="token operator">&gt;</span><span class="token operator">&amp;</span> lhs<span class="token punctuation">,</span> non_invalidating_vector_ref<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Alloc<span class="token operator">&gt;</span><span class="token operator">&amp;</span> rhs <span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">(</span><span class="token keyword">noexcept</span><span class="token punctuation">(</span>lhs<span class="token punctuation">.</span><span class="token function">swap</span><span class="token punctuation">(</span>rhs<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span> <span class="token class-name">T</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Alloc</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">U</span> <span class="token operator">=</span> T <span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> non_invalidating_vector_ref<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Alloc<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>size_type <span class="token function">erase</span><span class="token punctuation">(</span> non_invalidating_vector_ref<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Alloc<span class="token operator">&gt;</span><span class="token operator">&amp;</span> c<span class="token punctuation">,</span> <span class="token keyword">const</span> U<span class="token operator">&amp;</span> value <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span> <span class="token class-name">T</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Alloc</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Pred</span> <span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> non_invalidating_vector_ref<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Alloc<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>size_type <span class="token function">erase_if</span><span class="token punctuation">(</span> non_invalidating_vector_ref<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Alloc<span class="token operator">&gt;</span><span class="token operator">&amp;</span> c<span class="token punctuation">,</span> Pred pred <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span>
    <span class="token keyword">class</span> <span class="token class-name">T</span><span class="token punctuation">,</span>
    <span class="token keyword">class</span> <span class="token class-name">Allocator</span> <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>allocator<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span><span class="token punctuation">,</span>
    <span class="token keyword">class</span> <span class="token class-name">Container</span> <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span>
<span class="token operator">&gt;</span>
<span class="token keyword">class</span> <span class="token class-name">non_invalidating_vector</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span><span class="token operator">:</span>
    <span class="token comment">// Member types</span>
    <span class="token keyword">typedef</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span> actual_type<span class="token punctuation">;</span>

    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>value_type value_type<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>allocator_type allocator_type<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>size_type size_type<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>difference_type difference_type<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>reference reference<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>const_reference const_reference<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>pointer pointer<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>const_pointer const_pointer<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>iterator iterator<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>const_iterator const_iterator<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>reverse_iterator reverse_iterator<span class="token punctuation">;</span>
    <span class="token keyword">typedef</span> actual_type<span class="token double-colon punctuation">::</span>const_reverse_iterator const_reverse_iterator<span class="token punctuation">;</span>
<span class="token keyword">private</span><span class="token operator">:</span>
    actual_type inner<span class="token punctuation">;</span>
<span class="token keyword">public</span><span class="token operator">:</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">(</span><span class="token keyword">noexcept</span><span class="token punctuation">(</span><span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token operator">:</span> <span class="token function">inner</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">explicit</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> alloc <span class="token punctuation">)</span> <span class="token keyword">noexcept</span>
        <span class="token operator">:</span> <span class="token function">inner</span><span class="token punctuation">(</span>alloc<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span> size_type count<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> value<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> alloc <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span>
        <span class="token operator">:</span> <span class="token function">inner</span><span class="token punctuation">(</span>count<span class="token punctuation">,</span> value<span class="token punctuation">,</span> alloc<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
    <span class="token keyword">explicit</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span> size_type count<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> alloc <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span>
        <span class="token operator">:</span> <span class="token function">inner</span><span class="token punctuation">(</span>count<span class="token punctuation">,</span> alloc<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
    <span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span> <span class="token class-name">InputIt</span> <span class="token operator">&gt;</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span> InputIt first<span class="token punctuation">,</span> InputIt last<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> alloc <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span>
        <span class="token operator">:</span> <span class="token function">inner</span><span class="token punctuation">(</span>first<span class="token punctuation">,</span> last<span class="token punctuation">,</span> alloc<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span> <span class="token keyword">const</span> non_invalidating_vector<span class="token operator">&amp;</span> other <span class="token punctuation">)</span>
        <span class="token operator">:</span> <span class="token function">inner</span><span class="token punctuation">(</span>other<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span> <span class="token keyword">const</span> non_invalidating_vector<span class="token operator">&amp;</span> other<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> alloc <span class="token punctuation">)</span>
        <span class="token operator">:</span> <span class="token function">inner</span><span class="token punctuation">(</span>other<span class="token punctuation">,</span> alloc<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span> non_invalidating_vector<span class="token operator">&amp;&amp;</span> other <span class="token punctuation">)</span> <span class="token keyword">noexcept</span>
        <span class="token operator">:</span> <span class="token function">inner</span><span class="token punctuation">(</span>other<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span> non_invalidating_vector<span class="token operator">&amp;&amp;</span> other<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> alloc <span class="token punctuation">)</span>
        <span class="token operator">:</span> <span class="token function">inner</span><span class="token punctuation">(</span>other<span class="token punctuation">,</span> alloc<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span> std<span class="token double-colon punctuation">::</span>initializer_list<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> init<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> alloc <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span>
        <span class="token operator">:</span> <span class="token function">inner</span><span class="token punctuation">(</span>init<span class="token punctuation">,</span> alloc<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
    <span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span> <span class="token class-name">R</span> <span class="token operator">&gt;</span>
    <span class="token keyword">constexpr</span> <span class="token function">non_invalidating_vector</span><span class="token punctuation">(</span> std<span class="token double-colon punctuation">::</span>from_range_t<span class="token punctuation">,</span> R<span class="token operator">&amp;&amp;</span> rg<span class="token punctuation">,</span> <span class="token keyword">const</span> Allocator<span class="token operator">&amp;</span> alloc <span class="token operator">=</span> <span class="token function">Allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span>
        <span class="token operator">:</span> <span class="token function">inner</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>from_range<span class="token punctuation">,</span> rg<span class="token punctuation">,</span> alloc<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>

    <span class="token keyword">constexpr</span> allocator_type <span class="token function">get_allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">get_allocator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">// Element access</span>
    <span class="token keyword">constexpr</span> reference <span class="token function">at</span><span class="token punctuation">(</span> size_type pos <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">at</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_reference <span class="token function">at</span><span class="token punctuation">(</span> size_type pos <span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">at</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> reference <span class="token keyword">operator</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span> size_type pos <span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">[</span>pos<span class="token punctuation">]</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_reference <span class="token keyword">operator</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span> size_type pos <span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">[</span>pos<span class="token punctuation">]</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> reference <span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_reference <span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> reference <span class="token function">back</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">back</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_reference <span class="token function">back</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">back</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> T<span class="token operator">*</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">const</span> T<span class="token operator">*</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">// Iterators</span>
    <span class="token keyword">constexpr</span> iterator <span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_iterator <span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_iterator <span class="token function">cbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">cbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> iterator <span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_iterator <span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_iterator <span class="token function">cend</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">cend</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> reverse_iterator <span class="token function">rbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">rbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_reverse_iterator <span class="token function">rbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">rbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_reverse_iterator <span class="token function">crbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">crbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> reverse_iterator <span class="token function">rend</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">rend</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_reverse_iterator <span class="token function">rend</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">rend</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> const_reverse_iterator <span class="token function">crend</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token keyword">noexcept</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">crend</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">// Capacity</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">bool</span> <span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> size_type <span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> size_type <span class="token function">max_size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">max_size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">constexpr</span> size_type <span class="token function">capacity</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">.</span><span class="token function">capacity</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">void</span> <span class="token function">shrink_to_fit</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token comment">// Modifiers</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">clear</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span> const_iterator pos<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> value <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span> const_iterator pos<span class="token punctuation">,</span> T<span class="token operator">&amp;&amp;</span> value <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span> const_iterator pos<span class="token punctuation">,</span> size_type count<span class="token punctuation">,</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> value <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span> <span class="token class-name">InputIt</span> <span class="token operator">&gt;</span>
    <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span> const_iterator pos<span class="token punctuation">,</span> InputIt first<span class="token punctuation">,</span> InputIt last <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> iterator <span class="token function">insert</span><span class="token punctuation">(</span> const_iterator pos<span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span>initializer_list<span class="token operator">&lt;</span>T<span class="token operator">&gt;</span> ilist <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span> <span class="token class-name">R</span> <span class="token operator">&gt;</span>
    <span class="token keyword">constexpr</span> iterator <span class="token function">insert_range</span><span class="token punctuation">(</span> const_iterator pos<span class="token punctuation">,</span> R<span class="token operator">&amp;&amp;</span> rg <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> Args <span class="token operator">&gt;</span>
    <span class="token keyword">constexpr</span> iterator <span class="token function">emplace</span><span class="token punctuation">(</span> const_iterator pos<span class="token punctuation">,</span> Args<span class="token operator">&amp;&amp;</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> args <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> iterator <span class="token function">erase</span><span class="token punctuation">(</span> const_iterator pos <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> iterator <span class="token function">erase</span><span class="token punctuation">(</span> const_iterator first<span class="token punctuation">,</span> const_iterator last <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">push_back</span><span class="token punctuation">(</span> <span class="token keyword">const</span> T<span class="token operator">&amp;</span> value <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">push_back</span><span class="token punctuation">(</span> T<span class="token operator">&amp;&amp;</span> value <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> Args <span class="token operator">&gt;</span>
    <span class="token keyword">constexpr</span> reference <span class="token function">emplace_back</span><span class="token punctuation">(</span> Args<span class="token operator">&amp;&amp;</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> args <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span> <span class="token class-name">R</span> <span class="token operator">&gt;</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">append_range</span><span class="token punctuation">(</span> R<span class="token operator">&amp;&amp;</span> rg <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">pop_back</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">resize</span><span class="token punctuation">(</span> size_type count <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">resize</span><span class="token punctuation">(</span> size_type count<span class="token punctuation">,</span> <span class="token keyword">const</span> value_type<span class="token operator">&amp;</span> value <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
    <span class="token keyword">constexpr</span> <span class="token keyword">void</span> <span class="token function">swap</span><span class="token punctuation">(</span> actual_type<span class="token operator">&amp;</span> other <span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>allocator_traits<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>propagate_on_container_swap<span class="token double-colon punctuation">::</span>value <span class="token operator">||</span> std<span class="token double-colon punctuation">::</span>allocator_traits<span class="token operator">&lt;</span>Allocator<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>is_always_equal<span class="token double-colon punctuation">::</span>value<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>

    <span class="token keyword">operator</span> <span class="token generic-function"><span class="token function">non_invalidating_vector_ref</span><span class="token generic class-name"><span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> non_invalidating_vector_ref<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Allocator<span class="token operator">&gt;</span><span class="token punctuation">{</span>inner<span class="token punctuation">}</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">operator</span> <span class="token keyword">const</span> actual_type<span class="token operator">&amp;</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">return</span> inner<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span> <span class="token class-name">T</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Alloc</span> <span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> <span class="token keyword">bool</span> <span class="token keyword">operator</span><span class="token operator">==</span><span class="token punctuation">(</span> <span class="token keyword">const</span> non_invalidating_vector<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Alloc<span class="token operator">&gt;</span><span class="token operator">&amp;</span> lhs<span class="token punctuation">,</span>
                 <span class="token keyword">const</span> non_invalidating_vector<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Alloc<span class="token operator">&gt;</span><span class="token operator">&amp;</span> rhs <span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">return</span> lhs<span class="token punctuation">.</span>ref <span class="token operator">==</span> rhs<span class="token punctuation">.</span>ref<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span> <span class="token class-name">T</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Alloc</span> <span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> <span class="token keyword">auto</span><span class="token comment">/*std::synth-three-way-result&lt;T&gt;*/</span>
    <span class="token keyword">operator</span><span class="token operator">&lt;=&gt;</span><span class="token punctuation">(</span> <span class="token keyword">const</span> non_invalidating_vector<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Alloc<span class="token operator">&gt;</span><span class="token operator">&amp;</span> lhs<span class="token punctuation">,</span>
                 <span class="token keyword">const</span> non_invalidating_vector<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Alloc<span class="token operator">&gt;</span><span class="token operator">&amp;</span> rhs <span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">return</span> lhs<span class="token punctuation">.</span>ref <span class="token operator">&lt;=&gt;</span> rhs<span class="token punctuation">.</span>ref<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span> <span class="token class-name">T</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Alloc</span> <span class="token operator">&gt;</span>
<span class="token keyword">void</span> <span class="token function">swap</span><span class="token punctuation">(</span> non_invalidating_vector<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Alloc<span class="token operator">&gt;</span><span class="token operator">&amp;</span> lhs<span class="token punctuation">,</span> non_invalidating_vector<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Alloc<span class="token operator">&gt;</span><span class="token operator">&amp;</span> rhs <span class="token punctuation">)</span> <span class="token keyword">noexcept</span><span class="token punctuation">(</span><span class="token keyword">noexcept</span><span class="token punctuation">(</span>lhs<span class="token punctuation">.</span><span class="token function">swap</span><span class="token punctuation">(</span>rhs<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span> <span class="token class-name">T</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Alloc</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">U</span> <span class="token operator">=</span> T <span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> non_invalidating_vector<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Alloc<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>size_type <span class="token function">erase</span><span class="token punctuation">(</span> non_invalidating_vector<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Alloc<span class="token operator">&gt;</span><span class="token operator">&amp;</span> c<span class="token punctuation">,</span> <span class="token keyword">const</span> U<span class="token operator">&amp;</span> value <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span> <span class="token keyword">class</span> <span class="token class-name">T</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Alloc</span><span class="token punctuation">,</span> <span class="token keyword">class</span> <span class="token class-name">Pred</span> <span class="token operator">&gt;</span>
<span class="token keyword">constexpr</span> non_invalidating_vector<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Alloc<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>size_type <span class="token function">erase_if</span><span class="token punctuation">(</span> non_invalidating_vector<span class="token operator">&lt;</span>T<span class="token punctuation">,</span> Alloc<span class="token operator">&gt;</span><span class="token operator">&amp;</span> c<span class="token punctuation">,</span> Pred pred <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">delete</span><span class="token punctuation">;</span>
</code></pre><h2 id="References" data-id="References"><a class="anchor hidden-xs" href="#References" title="References"><span class="octicon octicon-link ph ph-link-simple-horizontal"></span></a><span>References</span></h2><hr class="footnotes-sep"><section class="footnotes">
<ol class="footnotes-list" style="padding-left: 2em;">
<li id="fn1" class="footnote-item"><p><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3274r0.pdf" target="_blank" rel="noopener"><span>https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3274r0.pdf</span></a> <a href="#fnref1" class="footnote-backref">↩︎</a> <a href="#fnref1-1" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn2" class="footnote-item"><p><a href="https://github.com/microsoft/GSL" target="_blank" rel="noopener"><span>https://github.com/microsoft/GSL</span></a> <a href="#fnref2" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn3" class="footnote-item"><p><a href="https://github.com/gsl-lite/gsl-lite" target="_blank" rel="noopener"><span>https://github.com/gsl-lite/gsl-lite</span></a> <a href="#fnref3" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn4" class="footnote-item"><p><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/n4981.pdf" target="_blank" rel="noopener"><span>https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/n4981.pdf</span></a> <a href="#fnref4" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section></div>
    <div class="ui-toc dropup unselectable hidden-print" style="display:none;">
        <div class="pull-right dropdown">
            <a id="tocLabel" class="ui-toc-label btn btn-default" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false" title="Table of content">
                <i class="fa fa-bars"></i>
            </a>
            <ul id="ui-toc" class="ui-toc-dropdown dropdown-menu" aria-labelledby="tocLabel">
                <div class="toc"><ul class="nav">
<li><a href="#non_invalidating_vector" title="non_invalidating_vector">non_invalidating_vector</a><ul class="nav">
<li><a href="#Table-of-contents" title="Table of contents">Table of contents</a></li>
<li><a href="#Abstract" title="Abstract">Abstract</a></li>
<li><a href="#Motivational-Example" title="Motivational Example">Motivational Example</a><ul class="nav">
<li><a href="#non_invalidating_vector_ref" title="non_invalidating_vector_ref">non_invalidating_vector_ref</a></li>
<li><a href="#non_invalidating_vector5" title="non_invalidating_vector">non_invalidating_vector</a></li>
</ul>
</li>
<li><a href="#Prior-Work" title="Prior Work">Prior Work</a></li>
<li><a href="#Potential-Improvements" title="Potential Improvements">Potential Improvements</a></li>
<li><a href="#Alternative" title="Alternative">Alternative</a><ul class="nav">
<li><a href="#Refactor-vector" title="Refactor vector">Refactor vector</a></li>
</ul>
</li>
<li><a href="#Wording" title="Wording">Wording</a><ul class="nav">
<li><a href="#24311-Class-template-non_invalidating_vector_ref-non_invalidating_vector_ref" title="24.3.11 Class template non_invalidating_vector_ref [non_invalidating_vector_ref]">24.3.11 Class template non_invalidating_vector_ref [non_invalidating_vector_ref]</a></li>
<li><a href="#24311-Class-template-non_invalidating_vector-non_invalidating_vector" title="24.3.11 Class template non_invalidating_vector [non_invalidating_vector]">24.3.11 Class template non_invalidating_vector [non_invalidating_vector]</a></li>
</ul>
</li>
<li><a href="#Alternate-Wording" title="Alternate Wording">Alternate Wording</a><ul class="nav">
<li><a href="#24311-Class-template-non_invalidating_vector-non_invalidating_vector23" title="24.3.11 Class template non_invalidating_vector [non_invalidating_vector]">24.3.11 Class template non_invalidating_vector [non_invalidating_vector]</a></li>
<li><a href="#24311-Class-template-vector-vector" title="24.3.11 Class template vector [vector]">24.3.11 Class template vector [vector]</a></li>
<li><a href="#2431165-Erasure-vectorerasure" title="24.3.11.65 Erasure [vector.erasure]">24.3.11.65 Erasure [vector.erasure]</a></li>
<li><a href="#Feature-test-macro-versionsyn" title="Feature-test macro [version.syn]">Feature-test macro [version.syn]</a></li>
</ul>
</li>
<li><a href="#Impact-on-the-standard" title="Impact on the standard">Impact on the standard</a></li>
<li><a href="#Implementation" title="Implementation">Implementation</a></li>
<li><a href="#References" title="References">References</a></li>
</ul>
</li>
</ul>
</div><div class="toc-menu"><a class="expand-toggle" href="#">Expand all</a><a class="back-to-top" href="#">Back to top</a><a class="go-to-bottom" href="#">Go to bottom</a></div>
            </ul>
        </div>
    </div>
    <div id="ui-toc-affix" class="ui-affix-toc ui-toc-dropdown unselectable hidden-print" data-spy="affix" style="top:17px;display:none;"  >
        <div class="toc"><ul class="nav">
<li><a href="#non_invalidating_vector" title="non_invalidating_vector">non_invalidating_vector</a><ul class="nav">
<li><a href="#Table-of-contents" title="Table of contents">Table of contents</a></li>
<li><a href="#Abstract" title="Abstract">Abstract</a></li>
<li><a href="#Motivational-Example" title="Motivational Example">Motivational Example</a><ul class="nav">
<li><a href="#non_invalidating_vector_ref" title="non_invalidating_vector_ref">non_invalidating_vector_ref</a></li>
<li><a href="#non_invalidating_vector5" title="non_invalidating_vector">non_invalidating_vector</a></li>
</ul>
</li>
<li><a href="#Prior-Work" title="Prior Work">Prior Work</a></li>
<li><a href="#Potential-Improvements" title="Potential Improvements">Potential Improvements</a></li>
<li><a href="#Alternative" title="Alternative">Alternative</a><ul class="nav">
<li><a href="#Refactor-vector" title="Refactor vector">Refactor vector</a></li>
</ul>
</li>
<li><a href="#Wording" title="Wording">Wording</a><ul class="nav">
<li><a href="#24311-Class-template-non_invalidating_vector_ref-non_invalidating_vector_ref" title="24.3.11 Class template non_invalidating_vector_ref [non_invalidating_vector_ref]">24.3.11 Class template non_invalidating_vector_ref [non_invalidating_vector_ref]</a></li>
<li><a href="#24311-Class-template-non_invalidating_vector-non_invalidating_vector" title="24.3.11 Class template non_invalidating_vector [non_invalidating_vector]">24.3.11 Class template non_invalidating_vector [non_invalidating_vector]</a></li>
</ul>
</li>
<li><a href="#Alternate-Wording" title="Alternate Wording">Alternate Wording</a><ul class="nav">
<li><a href="#24311-Class-template-non_invalidating_vector-non_invalidating_vector23" title="24.3.11 Class template non_invalidating_vector [non_invalidating_vector]">24.3.11 Class template non_invalidating_vector [non_invalidating_vector]</a></li>
<li><a href="#24311-Class-template-vector-vector" title="24.3.11 Class template vector [vector]">24.3.11 Class template vector [vector]</a></li>
<li><a href="#2431165-Erasure-vectorerasure" title="24.3.11.65 Erasure [vector.erasure]">24.3.11.65 Erasure [vector.erasure]</a></li>
<li><a href="#Feature-test-macro-versionsyn" title="Feature-test macro [version.syn]">Feature-test macro [version.syn]</a></li>
</ul>
</li>
<li><a href="#Impact-on-the-standard" title="Impact on the standard">Impact on the standard</a></li>
<li><a href="#Implementation" title="Implementation">Implementation</a></li>
<li><a href="#References" title="References">References</a></li>
</ul>
</li>
</ul>
</div><div class="toc-menu"><a class="expand-toggle" href="#">Expand all</a><a class="back-to-top" href="#">Back to top</a><a class="go-to-bottom" href="#">Go to bottom</a></div>
    </div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha256-U5ZEeKfGNOja007MMD3YBI0A3OSZOQbeG6z2f2Y0hu8=" crossorigin="anonymous" defer></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/gist-embed/2.6.0/gist-embed.min.js" integrity="sha256-KyF2D6xPIJUW5sUDSs93vWyZm+1RzIpKCexxElmxl8g=" crossorigin="anonymous" defer></script>
    <script>
        var markdown = $(".markdown-body");
        //smooth all hash trigger scrolling
        function smoothHashScroll() {
            var hashElements = $("a[href^='#']").toArray();
            for (var i = 0; i < hashElements.length; i++) {
                var element = hashElements[i];
                var $element = $(element);
                var hash = element.hash;
                if (hash) {
                    $element.on('click', function (e) {
                        // store hash
                        var hash = this.hash;
                        if ($(hash).length <= 0) return;
                        // prevent default anchor click behavior
                        e.preventDefault();
                        // animate
                        $('body, html').stop(true, true).animate({
                            scrollTop: $(hash).offset().top
                        }, 100, "linear", function () {
                            // when done, add hash to url
                            // (default click behaviour)
                            window.location.hash = hash;
                        });
                    });
                }
            }
        }

        smoothHashScroll();
        var toc = $('.ui-toc');
        var tocAffix = $('.ui-affix-toc');
        var tocDropdown = $('.ui-toc-dropdown');
        //toc
        tocDropdown.click(function (e) {
            e.stopPropagation();
        });

        var enoughForAffixToc = true;

        function generateScrollspy() {
            $(document.body).scrollspy({
                target: ''
            });
            $(document.body).scrollspy('refresh');
            if (enoughForAffixToc) {
                toc.hide();
                tocAffix.show();
            } else {
                tocAffix.hide();
                toc.show();
            }
            $(document.body).scroll();
        }

        function windowResize() {
            //toc right
            var paddingRight = parseFloat(markdown.css('padding-right'));
            var right = ($(window).width() - (markdown.offset().left + markdown.outerWidth() - paddingRight));
            toc.css('right', right + 'px');
            //affix toc left
            var newbool;
            var rightMargin = (markdown.parent().outerWidth() - markdown.outerWidth()) / 2;
            //for ipad or wider device
            if (rightMargin >= 133) {
                newbool = true;
                var affixLeftMargin = (tocAffix.outerWidth() - tocAffix.width()) / 2;
                var left = markdown.offset().left + markdown.outerWidth() - affixLeftMargin;
                tocAffix.css('left', left + 'px');
            } else {
                newbool = false;
            }
            if (newbool != enoughForAffixToc) {
                enoughForAffixToc = newbool;
                generateScrollspy();
            }
        }
        $(window).resize(function () {
            windowResize();
        });
        $(document).ready(function () {
            windowResize();
            generateScrollspy();
        });

        //remove hash
        function removeHash() {
            window.location.hash = '';
        }

        var backtotop = $('.back-to-top');
        var gotobottom = $('.go-to-bottom');

        backtotop.click(function (e) {
            e.preventDefault();
            e.stopPropagation();
            if (scrollToTop)
                scrollToTop();
            removeHash();
        });
        gotobottom.click(function (e) {
            e.preventDefault();
            e.stopPropagation();
            if (scrollToBottom)
                scrollToBottom();
            removeHash();
        });

        var toggle = $('.expand-toggle');
        var tocExpand = false;

        checkExpandToggle();
        toggle.click(function (e) {
            e.preventDefault();
            e.stopPropagation();
            tocExpand = !tocExpand;
            checkExpandToggle();
        })

        function checkExpandToggle () {
            var toc = $('.ui-toc-dropdown .toc');
            var toggle = $('.expand-toggle');
            if (!tocExpand) {
                toc.removeClass('expand');
                toggle.text('Expand all');
            } else {
                toc.addClass('expand');
                toggle.text('Collapse all');
            }
        }

        function scrollToTop() {
            $('body, html').stop(true, true).animate({
                scrollTop: 0
            }, 100, "linear");
        }

        function scrollToBottom() {
            $('body, html').stop(true, true).animate({
                scrollTop: $(document.body)[0].scrollHeight
            }, 100, "linear");
        }
    </script>
</body>

</html>
