﻿<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <meta charset="utf-8">
    <!-- TITLE -->
    <title>A friendlier tuple get</title>
    <style name="main.css">
        @import url(https://fonts.googleapis.com/css?family=Muli:400,300);
        @import url(https://fonts.googleapis.com/css?family=Share:400,700);
        /* ============================== */
        /* BODY */
        /* ============================== */
        body {
            font-family: 'Muli',arial,sans-serif;
            background-color: #FEFEFE;
            margin: 0;
            padding: 0;
            font-size: 0.875em;
            color: #616161;
        }

        h1, h2, h3, h4, h5, h6 {
            margin-bottom: 0.5em;
            font-family: 'Share';
        }

        .title {
            border-bottom: solid 2px #f5aa10;
        }

        #container {
            margin: 0 auto;
            width: 60%;
            min-width: 640px;
            overflow: auto;
        }

        #main {
            width: 100%;
        }

        a {
            color: #3C6EB4;
            cursor: pointer;
            text-decoration: none;
        }

            a:hover {
                text-decoration: underline;
            }
        /* ============================== */
        /* HEADER */
        /* ============================== */
        #head {
            overflow: auto;
            margin: 40px 0;
        }

            #head div.top {
                font-size: 2.4em;
                margin-right: 80px;
            }

            #head div.bottom {
                height: 38px;
                margin-right: 80px;
            }

            #head .logo {
                vertical-align: bottom;
            }

            #head a.name {
                text-decoration: none;
                color: #555;
                font-weight: bold;
                overflow: auto;
            }

            #head span.slogan {
                color: #CCC;
            }
        /* ============================== */
        /* POST VIEW*/
        /* ============================== */
        article.post {
            margin-bottom: 60px;
            clear: both;
            overflow: auto;
        }

            article.post header.post {
                margin-bottom: 10px;
            }

                article.post header.post h1.title {
                    font-weight: bold;
                    margin: 0;
                }

                    article.post header.post h1.title a {
                        color: inherit;
                        text-decoration: none;
                    }

                article.post header.post div.date {
                    font-size: 0.9em;
                    font-weight: bold;
                    text-align: right;
                    text-transform: uppercase;
                    color: #999;
                }

            article.post .body {
                font-size: 1.2em;
            }

            article.post .console {
                background: url("img/console.png") no-repeat scroll 10px center #F1F1F1;
                display: block;
                line-height: 50px;
                margin: 5px 0;
                padding-left: 60px;
            }

            article.post img:not(.captcha) {
                max-width: 100%;
            }

            article.post blockquote {
                font-size: 1em;
                width: 80%;
                margin-left: 2em;
                padding-left: 0.5em;
                border-left: 2px solid #C3C3C3;
            }

            article.post footer.post {
                clear: both;
                margin-top: 20px;
                text-align: center;
            }

        article pre {
            border: 1px dashed #ccc;
            padding: 1em;
            background: #f4f4f4;
        }

        article.pre, article.code {
            font-family: monospace;
            font-size: 1em;
        }
        /* ============================== */
        /* TABLES */
        /* ============================== */
        table {
            border: 1px solid #999;
        }

            table th, table td {
                background: #f4f4f4;
                padding: 5px 15px;
            }

            table thead {
                border-bottom: 1px solid #999;
            }

            table th {
                font-weight: bold;
                background: #eaeaea;
            }

            table td, table th {
                border-right: 1px solid #999;
            }
    </style>
    <!-- SyntaxHighlighter -->
    <style name="normalize.css">
        article, aside, details, figcaption, figure, footer, header, hgroup, nav, section, summary {
            display: block;
        }

        audio, canvas, video {
            display: inline-block;
        }

            audio:not([controls]) {
                display: none;
                height: 0;
            }

        [hidden] {
            display: none;
        }

        html {
            font-family: sans-serif;
            -webkit-text-size-adjust: 100%;
            -ms-text-size-adjust: 100%;
        }

        a:focus {
            outline: thin dotted;
        }

        a:active, a:hover {
            outline: 0;
        }

        h1 {
            font-size: 2em;
        }

        abbr[title] {
            border-bottom: 1px dotted;
        }

        b, strong {
            font-weight: 700;
        }

        dfn {
            font-style: italic;
        }

        mark {
            background: #ff0;
            color: #000;
        }

        code, kbd, pre, samp {
            font-family: monospace, serif;
            font-size: 1em;
        }

        pre {
            white-space: pre-wrap;
            word-wrap: break-word;
        }

        q {
            quotes: \201C \201D \2018 \2019;
        }

        small {
            font-size: 80%;
        }

        sub, sup {
            font-size: 75%;
            line-height: 0;
            position: relative;
            vertical-align: baseline;
        }

        sup {
            top: -.5em;
        }

        sub {
            bottom: -.25em;
        }

        img {
            border: 0;
        }

        svg:not(:root) {
            overflow: hidden;
        }

        fieldset {
            border: 1px solid silver;
            margin: 0 2px;
            padding: .35em .625em .75em;
        }

        button, input, select, textarea {
            font-family: inherit;
            font-size: 100%;
            margin: 0;
        }

        button, input {
            line-height: normal;
        }

            button, html input[type=button], /* 1 */
            input[type=reset], input[type=submit] {
                -webkit-appearance: button;
                cursor: pointer;
            }

                button[disabled], input[disabled] {
                    cursor: default;
                }

            input[type=checkbox], input[type=radio] {
                box-sizing: border-box;
                padding: 0;
            }

            input[type=search] {
                -webkit-appearance: textfield;
                -moz-box-sizing: content-box;
                -webkit-box-sizing: content-box;
                box-sizing: content-box;
            }

                input[type=search]::-webkit-search-cancel-button, input[type=search]::-webkit-search-decoration {
                    -webkit-appearance: none;
                }

        textarea {
            overflow: auto;
            vertical-align: top;
        }

        table {
            border-collapse: collapse;
            border-spacing: 0;
        }

        body, figure {
            margin: 0;
        }

        legend, button::-moz-focus-inner, input::-moz-focus-inner {
            border: 0;
            padding: 0;
        }
    </style>
    <style name="shCore.css">
        .syntaxhighlighter a,
        .syntaxhighlighter div,
        .syntaxhighlighter code,
        .syntaxhighlighter table,
        .syntaxhighlighter table td,
        .syntaxhighlighter table tr,
        .syntaxhighlighter table tbody,
        .syntaxhighlighter table thead,
        .syntaxhighlighter table caption,
        .syntaxhighlighter textarea {
            -moz-border-radius: 0 0 0 0 !important;
            -webkit-border-radius: 0 0 0 0 !important;
            background: none !important;
            border: 0 !important;
            bottom: auto !important;
            float: none !important;
            height: auto !important;
            left: auto !important;
            line-height: 1.1em !important;
            margin: 0 !important;
            outline: 0 !important;
            overflow: visible !important;
            padding: 0 !important;
            position: static !important;
            right: auto !important;
            text-align: left !important;
            top: auto !important;
            vertical-align: baseline !important;
            width: auto !important;
            box-sizing: content-box !important;
            font-family: monospace !important;
            font-weight: normal !important;
            font-style: normal !important;
            font-size: 1em !important;
            min-height: inherit !important;
            min-height: auto !important;
        }

        .syntaxhighlighter {
            margin: 1em 0 1em 0 !important;
            overflow: auto !important;
            font-size: 1em !important;
        }

            .syntaxhighlighter.source {
                overflow: hidden !important;
            }

            .syntaxhighlighter .bold {
                font-weight: bold !important;
            }

            .syntaxhighlighter .italic {
                font-style: italic !important;
            }

            .syntaxhighlighter .line {
                white-space: pre !important;
            }

            .syntaxhighlighter table {
                width: 100% !important;
            }

                .syntaxhighlighter table caption {
                    text-align: left !important;
                    padding: .5em 0 0.5em 1em !important;
                }

                .syntaxhighlighter table td.code {
                    width: 100% !important;
                }

                    .syntaxhighlighter table td.code .container {
                        position: relative !important;
                    }

                        .syntaxhighlighter table td.code .container textarea {
                            box-sizing: border-box !important;
                            position: absolute !important;
                            left: 0 !important;
                            top: 0 !important;
                            width: 100% !important;
                            height: 100% !important;
                            border: none !important;
                            background: white !important;
                            padding-left: 1em !important;
                            overflow: hidden !important;
                            white-space: pre !important;
                        }

                .syntaxhighlighter table td.gutter .line {
                    text-align: right !important;
                    padding: 0 0.5em 0 1em !important;
                }

                .syntaxhighlighter table td.code .line {
                    padding: 0 1em !important;
                }

            .syntaxhighlighter.nogutter td.code .container textarea, .syntaxhighlighter.nogutter td.code .line {
                padding-left: 0em !important;
            }

            .syntaxhighlighter.show {
                display: block !important;
            }

            .syntaxhighlighter.collapsed table {
                display: none !important;
            }

            .syntaxhighlighter.collapsed .toolbar {
                padding: 0.1em 0.8em 0em 0.8em !important;
                font-size: 1em !important;
                position: static !important;
                width: auto !important;
                height: auto !important;
            }

                .syntaxhighlighter.collapsed .toolbar span {
                    display: inline !important;
                    margin-right: 1em !important;
                }

                    .syntaxhighlighter.collapsed .toolbar span a {
                        padding: 0 !important;
                        display: none !important;
                    }

                        .syntaxhighlighter.collapsed .toolbar span a.expandSource {
                            display: inline !important;
                        }

            .syntaxhighlighter .toolbar {
                position: absolute !important;
                right: 1px !important;
                top: 1px !important;
                width: 11px !important;
                height: 11px !important;
                font-size: 10px !important;
                z-index: 10 !important;
            }

                .syntaxhighlighter .toolbar span.title {
                    display: inline !important;
                }

                .syntaxhighlighter .toolbar a {
                    display: block !important;
                    text-align: center !important;
                    text-decoration: none !important;
                    padding-top: 1px !important;
                }

                    .syntaxhighlighter .toolbar a.expandSource {
                        display: none !important;
                    }

            .syntaxhighlighter.ie {
                font-size: .9em !important;
                padding: 1px 0 1px 0 !important;
            }

                .syntaxhighlighter.ie .toolbar {
                    line-height: 8px !important;
                }

                    .syntaxhighlighter.ie .toolbar a {
                        padding-top: 0px !important;
                    }

            .syntaxhighlighter.printing .line.alt1 .content,
            .syntaxhighlighter.printing .line.alt2 .content,
            .syntaxhighlighter.printing .line.highlighted .number,
            .syntaxhighlighter.printing .line.highlighted.alt1 .content,
            .syntaxhighlighter.printing .line.highlighted.alt2 .content {
                background: none !important;
            }

            .syntaxhighlighter.printing .line .number {
                color: #bbbbbb !important;
            }

            .syntaxhighlighter.printing .line .content {
                color: black !important;
            }

            .syntaxhighlighter.printing .toolbar {
                display: none !important;
            }

            .syntaxhighlighter.printing a {
                text-decoration: none !important;
            }

            .syntaxhighlighter.printing .plain, .syntaxhighlighter.printing .plain a {
                color: black !important;
            }

            .syntaxhighlighter.printing .comments, .syntaxhighlighter.printing .comments a {
                color: #008200 !important;
            }

            .syntaxhighlighter.printing .string, .syntaxhighlighter.printing .string a {
                color: blue !important;
            }

            .syntaxhighlighter.printing .keyword {
                color: #006699 !important;
                font-weight: bold !important;
            }

            .syntaxhighlighter.printing .preprocessor {
                color: gray !important;
            }

            .syntaxhighlighter.printing .variable {
                color: #aa7700 !important;
            }

            .syntaxhighlighter.printing .value {
                color: #009900 !important;
            }

            .syntaxhighlighter.printing .functions {
                color: #ff1493 !important;
            }

            .syntaxhighlighter.printing .constants {
                color: #0066cc !important;
            }

            .syntaxhighlighter.printing .script {
                font-weight: bold !important;
            }

            .syntaxhighlighter.printing .color1, .syntaxhighlighter.printing .color1 a {
                color: gray !important;
            }

            .syntaxhighlighter.printing .color2, .syntaxhighlighter.printing .color2 a {
                color: #ff1493 !important;
            }

            .syntaxhighlighter.printing .color3, .syntaxhighlighter.printing .color3 a {
                color: red !important;
            }

            .syntaxhighlighter.printing .break, .syntaxhighlighter.printing .break a {
                color: black !important;
            }
    </style>
    <style name="shThemeDefault.css">
        .syntaxhighlighter {
            background-color: #f4f4f4 !important;
            border: 1px dashed #ccc;
            padding: 1em;
        }

            .syntaxhighlighter .line.alt1 {
                background-color: #f4f4f4 !important;
            }

            .syntaxhighlighter .line.alt2 {
                background-color: #f4f4f4 !important;
            }

            .syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
                background-color: #e0e0e0 !important;
            }

            .syntaxhighlighter .line.highlighted.number {
                color: black !important;
            }

            .syntaxhighlighter table caption {
                color: black !important;
            }

            .syntaxhighlighter .gutter {
                color: #afafaf !important;
            }

                .syntaxhighlighter .gutter .line {
                    border-right: 3px solid #6ce26c !important;
                }

                    .syntaxhighlighter .gutter .line.highlighted {
                        background-color: #6ce26c !important;
                        color: white !important;
                    }

            .syntaxhighlighter.printing .line .content {
                border: none !important;
            }

            .syntaxhighlighter.collapsed {
                overflow: visible !important;
            }

                .syntaxhighlighter.collapsed .toolbar {
                    color: blue !important;
                    background: #f4f4f4 !important;
                    border: 1px solid #6ce26c !important;
                }

                    .syntaxhighlighter.collapsed .toolbar a {
                        color: blue !important;
                    }

                        .syntaxhighlighter.collapsed .toolbar a:hover {
                            color: red !important;
                        }

            .syntaxhighlighter .toolbar {
                color: #f4f4f4 !important;
                background: #6ce26c !important;
                border: none !important;
            }

                .syntaxhighlighter .toolbar a {
                    color: #f4f4f4 !important;
                }

                    .syntaxhighlighter .toolbar a:hover {
                        color: black !important;
                    }

            .syntaxhighlighter .plain, .syntaxhighlighter .plain a {
                color: black !important;
            }

            .syntaxhighlighter .comments, .syntaxhighlighter .comments a {
                color: #008200 !important;
            }

            .syntaxhighlighter .string, .syntaxhighlighter .string a {
                color: blue !important;
            }

            .syntaxhighlighter .keyword {
                color: #006699 !important;
            }

            .syntaxhighlighter .preprocessor {
                color: gray !important;
            }

            .syntaxhighlighter .variable {
                color: #aa7700 !important;
            }

            .syntaxhighlighter .value {
                color: #009900 !important;
            }

            .syntaxhighlighter .functions {
                color: #ff1493 !important;
            }

            .syntaxhighlighter .constants {
                color: #0066cc !important;
            }

            .syntaxhighlighter .script {
                font-weight: bold !important;
                color: #006699 !important;
                background-color: none !important;
            }

            .syntaxhighlighter .color1, .syntaxhighlighter .color1 a {
                color: gray !important;
            }

            .syntaxhighlighter .color2, .syntaxhighlighter .color2 a {
                color: #ff1493 !important;
            }

            .syntaxhighlighter .color3, .syntaxhighlighter .color3 a {
                color: red !important;
            }

            .syntaxhighlighter .keyword {
                font-weight: bold !important;
            }
    </style>
</head>
<body>
    <div id="container">
        <section id="main">
            <article class="post">
                <p>
                    Document number: P0825R0<br>
                    Date: 2017-10-12<br>
                    Project: Programming Language C++, Library Evolution Working Group<br>
                    Reply-to: Agustín Bergé <a href="mailto:agustinberge@gmail.com">agustinberge@gmail.com</a>
                </p>

                <a name="a-friendlier-tuple-`get`" href="#a-friendlier-tuple-`get`"><h1>A friendlier tuple <code>get</code></h1></a>

                <a name="1.-introduction" href="#1.-introduction"><h2>1. Introduction</h2></a>

                <p>This paper proposes changing <code>std::get</code> overloads to behave gracefully in the presence of user defined <code>get</code> overloads.</p>

                <a name="2.-motivation" href="#2.-motivation"><h2>2. Motivation</h2></a>

                <p>Consider the following example, presented on <em>Cpplang</em> at Slack:</p>

                <div>
                    <div id="highlighter_964663" class="syntaxhighlighter nogutter  cpp">
                        <table border="0" cellspacing="0" cellpadding="0">
                            <tbody>
                                <tr>
                                    <td class="code">
                                        <div class="container">
                                            <div class="line number1 index0 alt2"><code class="cpp keyword bold">template</code> <code class="cpp plain">&lt;</code><code class="cpp keyword bold">typename</code><code class="cpp plain">... Ts&gt;</code></div>
                                            <div class="line number2 index1 alt1"><code class="cpp keyword bold">struct</code> <code class="cpp plain">WeirdTuple : </code><code class="cpp color1 bold">std::tuple</code><code class="cpp plain">&lt;Ts...&gt; {</code></div>
                                            <div class="line number3 index2 alt2"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp keyword bold">using</code> <code class="cpp color1 bold">std::tuple</code><code class="cpp plain">&lt;Ts...&gt;::tuple;</code></div>
                                            <div class="line number4 index3 alt1"><code class="cpp plain">};</code></div>
                                            <div class="line number5 index4 alt2">&nbsp;</div>
                                            <div class="line number6 index5 alt1"><code class="cpp keyword bold">template</code> <code class="cpp plain">&lt;</code><code class="cpp color1 bold">std::size_t</code> <code class="cpp plain">I, </code><code class="cpp keyword bold">typename</code><code class="cpp plain">... Ts&gt;</code></div>
                                            <div class="line number7 index6 alt2"><code class="cpp keyword bold">auto</code> <code class="cpp plain">get(WeirdTuple&lt;Ts...&gt;&amp; t) { </code><code class="cpp keyword bold">return</code> <code class="cpp plain">I + 10; }</code></div>
                                            <div class="line number8 index7 alt1">&nbsp;</div>
                                            <div class="line number9 index8 alt2"><code class="cpp color1 bold">int</code> <code class="cpp plain">main() {</code></div>
                                            <div class="line number10 index9 alt1"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">WeirdTuple&lt;</code><code class="cpp color1 bold">int</code><code class="cpp plain">&gt; wt(1);</code></div>
                                            <div class="line number11 index10 alt2">&nbsp;</div>
                                            <div class="line number12 index11 alt1"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">get&lt;0&gt;(wt); </code><code class="cpp comments">// changing this 0 to anything else will break</code></div>
                                            <div class="line number13 index12 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">// theoretically, that should still work -</code></div>
                                            <div class="line number14 index13 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">// we're obviously using the WeirdTuple overload of get&lt;&gt;(),</code></div>
                                            <div class="line number15 index14 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">// but the compiler fails when trying to compile </code><code class="cpp comments bold">every</code><code class="cpp comments"> possible overload!</code></div>
                                            <div class="line number16 index15 alt1"><code class="cpp plain">}</code></div>
                                        </div>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                    </div>
                </div>

                <p>After the aluded change, the result is:</p>

                <div>
                    <div id="highlighter_872575" class="syntaxhighlighter nogutter  cpp">
                        <table border="0" cellspacing="0" cellpadding="0">
                            <tbody>
                                <tr>
                                    <td class="code">
                                        <div class="container">
                                            <div class="line number1 index0 alt2"><code class="cpp plain">get&lt;1&gt;(wt); </code><code class="cpp comments">// error: static assertion failed: tuple index is in range</code></div>
                                            <div class="line number2 index1 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">// in instantiation of 'std::tuple_element&lt;1, std::tuple&lt;int&gt;&gt;'</code></div>
                                            <div class="line number3 index2 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">// required by substitution of</code></div>
                                            <div class="line number4 index3 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">//&nbsp;&nbsp; constexpr std::tuple_element_t&lt;I, std::tuple&lt;Ts...&gt;&gt;&amp;</code></div>
                                            <div class="line number5 index4 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">//&nbsp;&nbsp; std::get(std::tuple&lt;Ts...&gt;&amp;)</code></div>
                                            <div class="line number6 index5 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">//&nbsp;&nbsp; [with I = 1; Ts = {int}]</code></div>
                                        </div>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                    </div>
                </div>

                <p>The confusion arises from a disagreement between the programmer and the implementation on the "obviousness" of the intented target. A sufficiently advanced implementation might realize that no <code>std::get</code> overload would possibly be a better match than the <code>WeirdTuple</code> overload and thus skip substitution altogether, but it is not required to do so. During that substitution process the <code>std::get</code> overloads render the program ill-formed, effectively poisoning the overload set.</p>

                <a name="3.-discussion" href="#3.-discussion"><h2>3. Discussion</h2></a>

                <a name="3.1-sfinae-friendly" href="#3.1-sfinae-friendly"><h3>3.1 SFINAE-friendly</h3></a>

                <p>A traditional SFINAE-friendly implementation will get out of the user's way when used with an out of bounds index. The main disadvantage of this approach is that by not participating in overload resolution, it opens the door for user defined overloads even when called on a standard library tuple-like type; that is, given <code>t</code> of type <code>std::tuple&lt;UDT&gt;</code>, <code>get&lt;1&gt;(t)</code> might silently fall back to a <code>get</code> overload in an associated namespace of <code>UDT</code>. This regresses key functionality in the current <code>std::get</code> design, which mandates a diagnostic for out of bound access.</p>

                <a name="possible-implementation" href="#possible-implementation"><h4>Possible implementation:</h4></a>

                <div>
                    <div id="highlighter_25839" class="syntaxhighlighter nogutter  cpp">
                        <table border="0" cellspacing="0" cellpadding="0">
                            <tbody>
                                <tr>
                                    <td class="code">
                                        <div class="container">
                                            <div class="line number1 index0 alt2"><code class="cpp keyword bold">template</code> <code class="cpp plain">&lt;</code><code class="cpp color1 bold">std::size_t</code> <code class="cpp plain">I, </code><code class="cpp keyword bold">typename</code> <code class="cpp plain">...Ts,</code></div>
                                            <div class="line number2 index1 alt1"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp keyword bold">typename</code> <code class="cpp plain">Enable = </code><code class="cpp color1 bold">std::enable_if_t</code><code class="cpp plain">&lt;I &lt; </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">...(Ts)&gt;&gt;</code></div>
                                            <div class="line number3 index2 alt2"><code class="cpp color1 bold">std::tuple_element_t</code><code class="cpp plain">&lt;I, </code><code class="cpp color1 bold">std::tuple</code><code class="cpp plain">&lt;Ts...&gt;&gt;&amp;</code></div>
                                            <div class="line number4 index3 alt1"><code class="cpp plain">get(</code><code class="cpp color1 bold">std::tuple</code><code class="cpp plain">&lt;Ts...&gt;&amp; t) {</code></div>
                                            <div class="line number5 index4 alt2"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp keyword bold">return</code> <code class="cpp comments">/*...*/</code><code class="cpp plain">;</code></div>
                                            <div class="line number6 index5 alt1"><code class="cpp plain">}</code></div>
                                        </div>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                    </div>
                </div>

                <a name="out-of-bounds-access" href="#out-of-bounds-access"><h4>Out of bounds access:</h4></a>

                <div>
                    <div id="highlighter_360317" class="syntaxhighlighter nogutter  cpp">
                        <table border="0" cellspacing="0" cellpadding="0">
                            <tbody>
                                <tr>
                                    <td class="code">
                                        <div class="container">
                                            <div class="line number1 index0 alt2"><code class="cpp color1 bold">std::tuple</code><code class="cpp plain">&lt;</code><code class="cpp color1 bold">int</code><code class="cpp plain">&gt; t;</code></div>
                                            <div class="line number2 index1 alt1"><code class="cpp color1 bold">std::get</code><code class="cpp plain">&lt;1&gt;(t); </code><code class="cpp comments">// error: no matching function for call to 'get&lt;1&gt;(std::tuple&lt;int&gt;&amp;)'</code></div>
                                            <div class="line number3 index2 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">// note: candidate template ignored:</code></div>
                                            <div class="line number4 index3 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">//&nbsp;&nbsp; std::get(array&lt;Ts...&gt;&amp;)</code></div>
                                            <div class="line number5 index4 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">//&nbsp;&nbsp; could not match 'array' against 'tuple'</code></div>
                                            <div class="line number6 index5 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">// note: candidate template ignored:</code></div>
                                            <div class="line number7 index6 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">//&nbsp;&nbsp; std::get(pair&lt;Ts...&gt;&amp;)</code></div>
                                            <div class="line number8 index7 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">//&nbsp;&nbsp; could not match 'pair' against 'tuple'</code></div>
                                            <div class="line number9 index8 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">// note: candidate template ignored:</code></div>
                                            <div class="line number10 index9 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">//&nbsp;&nbsp; std::get(variant&lt;Ts...&gt;&amp;)</code></div>
                                            <div class="line number11 index10 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">//&nbsp;&nbsp; could not match 'variant' against 'tuple'</code></div>
                                            <div class="line number12 index11 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">// note: candidate template ignored:</code></div>
                                            <div class="line number13 index12 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">//&nbsp;&nbsp; std::get(std::tuple&lt;Ts...&gt;&amp;)</code></div>
                                            <div class="line number14 index13 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">//&nbsp;&nbsp; [with I = 1; Ts = {int}]</code></div>
                                            <div class="line number15 index14 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">//&nbsp;&nbsp; requirement 'I &lt; sizeof...(Ts)' was not satisfied</code></div>
                                        </div>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                    </div>
                </div>

                <a name="3.2-conditionally-deleted" href="#3.2-conditionally-deleted"><h3>3.2 Conditionally Deleted</h3></a>

                <p>A conditionally deleted implementation prevents the unintended fall back behavior of the traditional SFINAE-friendly approach, while still remaining SFINAE-friendly. As a bonus, diagnostics on out of bound access tend to be concise.</p>

                <a name="possible-implementation" href="#possible-implementation"><h4>Possible implementation:</h4></a>

                <div>
                    <div id="highlighter_579966" class="syntaxhighlighter nogutter  cpp">
                        <table border="0" cellspacing="0" cellpadding="0">
                            <tbody>
                                <tr>
                                    <td class="code">
                                        <div class="container">
                                            <div class="line number1 index0 alt2"><code class="cpp keyword bold">template</code> <code class="cpp plain">&lt;</code><code class="cpp color1 bold">std::size_t</code> <code class="cpp plain">I, </code><code class="cpp keyword bold">typename</code> <code class="cpp plain">...Ts,</code></div>
                                            <div class="line number2 index1 alt1"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp keyword bold">typename</code> <code class="cpp plain">Enable = </code><code class="cpp color1 bold">std::enable_if_t</code><code class="cpp plain">&lt;I &lt; </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">...(Ts)&gt;&gt;</code></div>
                                            <div class="line number3 index2 alt2"><code class="cpp color1 bold">std::tuple_element_t</code><code class="cpp plain">&lt;I, </code><code class="cpp color1 bold">std::tuple</code><code class="cpp plain">&lt;Ts...&gt;&gt;&amp;</code></div>
                                            <div class="line number4 index3 alt1"><code class="cpp plain">get(</code><code class="cpp color1 bold">std::tuple</code><code class="cpp plain">&lt;Ts...&gt;&amp; t) {</code></div>
                                            <div class="line number5 index4 alt2"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp keyword bold">return</code> <code class="cpp comments">/*...*/</code><code class="cpp plain">;</code></div>
                                            <div class="line number6 index5 alt1"><code class="cpp plain">}</code></div>
                                            <div class="line number7 index6 alt2">&nbsp;</div>
                                            <div class="line number8 index7 alt1"><code class="cpp keyword bold">template</code> <code class="cpp plain">&lt;</code><code class="cpp color1 bold">std::size_t</code> <code class="cpp plain">I, </code><code class="cpp keyword bold">typename</code> <code class="cpp plain">...Ts&gt;</code></div>
                                            <div class="line number9 index8 alt2"><code class="cpp color1 bold">std::enable_if_t</code><code class="cpp plain">&lt;</code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">...(Ts) &lt;= I&gt;</code></div>
                                            <div class="line number10 index9 alt1"><code class="cpp plain">get(</code><code class="cpp color1 bold">std::tuple</code><code class="cpp plain">&lt;Ts...&gt;&amp; t) = </code><code class="cpp keyword bold">delete</code><code class="cpp plain">;</code></div>
                                        </div>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                    </div>
                </div>

                <a name="out-of-bounds-access" href="#out-of-bounds-access"><h4>Out of bounds access:</h4></a>

                <div>
                    <div id="highlighter_682466" class="syntaxhighlighter nogutter  cpp">
                        <table border="0" cellspacing="0" cellpadding="0">
                            <tbody>
                                <tr>
                                    <td class="code">
                                        <div class="container">
                                            <div class="line number1 index0 alt2"><code class="cpp color1 bold">std::tuple</code><code class="cpp plain">&lt;</code><code class="cpp color1 bold">int</code><code class="cpp plain">&gt; t;</code></div>
                                            <div class="line number2 index1 alt1"><code class="cpp color1 bold">std::get</code><code class="cpp plain">&lt;1&gt;(t); </code><code class="cpp comments">// error: call to deleted function 'get'</code></div>
                                            <div class="line number3 index2 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">// note: declared here</code></div>
                                            <div class="line number4 index3 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">//&nbsp;&nbsp; std::get(std::tuple&lt;Ts...&gt;&amp;) = delete;</code></div>
                                            <div class="line number5 index4 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">//&nbsp;&nbsp; [with I = 1; Ts = {int}]</code></div>
                                        </div>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                    </div>
                </div>

                <a name="3.3-deduced-return-type" href="#3.3-deduced-return-type"><h3>3.3 Deduced Return Type</h3></a>

                <p>An implementation that uses deduced return types can defer the required diagnostic until the definition is instantiated. The main disadvantage is that such definition may need to be instantiated earlier/more often than an explicitly typed alternative, and that the result is SFINAE-unfriendly in those contexts. On the other side, diagnostics on out of bound access tend to be concise and could include a custom tailored message.</p>

                <a name="possible-implementation" href="#possible-implementation"><h4>Possible implementation:</h4></a>

                <div>
                    <div id="highlighter_535676" class="syntaxhighlighter nogutter  cpp">
                        <table border="0" cellspacing="0" cellpadding="0">
                            <tbody>
                                <tr>
                                    <td class="code">
                                        <div class="container">
                                            <div class="line number1 index0 alt2"><code class="cpp keyword bold">template</code> <code class="cpp plain">&lt;</code><code class="cpp color1 bold">std::size_t</code> <code class="cpp plain">I, </code><code class="cpp keyword bold">typename</code> <code class="cpp plain">...Ts&gt;</code></div>
                                            <div class="line number2 index1 alt1"><code class="cpp keyword bold">decltype</code><code class="cpp plain">(</code><code class="cpp keyword bold">auto</code><code class="cpp plain">) get(</code><code class="cpp color1 bold">std::tuple</code><code class="cpp plain">&lt;Ts...&gt;&amp; t) {</code></div>
                                            <div class="line number3 index2 alt2"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp keyword bold">static_assert</code><code class="cpp plain">(I &lt; </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">...(Ts), </code><code class="cpp string">"tuple index is in range"</code><code class="cpp plain">);</code></div>
                                            <div class="line number4 index3 alt1"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp keyword bold">return</code> <code class="cpp comments">/*...*/</code><code class="cpp plain">;</code></div>
                                            <div class="line number5 index4 alt2"><code class="cpp plain">}</code></div>
                                        </div>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                    </div>
                </div>

                <a name="out-of-bounds-access" href="#out-of-bounds-access"><h4>Out of bounds access:</h4></a>

                <div>
                    <div id="highlighter_974466" class="syntaxhighlighter nogutter  cpp">
                        <table border="0" cellspacing="0" cellpadding="0">
                            <tbody>
                                <tr>
                                    <td class="code">
                                        <div class="container">
                                            <div class="line number1 index0 alt2"><code class="cpp color1 bold">std::tuple</code><code class="cpp plain">&lt;</code><code class="cpp color1 bold">int</code><code class="cpp plain">&gt; t;</code></div>
                                            <div class="line number2 index1 alt1"><code class="cpp color1 bold">std::get</code><code class="cpp plain">&lt;1&gt;(t); </code><code class="cpp comments">// error: static assertion failed: tuple index is in range</code></div>
                                            <div class="line number3 index2 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">// in instantiation of</code></div>
                                            <div class="line number4 index3 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">//&nbsp;&nbsp; std::get(std::tuple&lt;Ts...&gt;&amp;)</code></div>
                                            <div class="line number5 index4 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp comments">//&nbsp;&nbsp; [with I = 1; Ts = {int}]</code></div>
                                        </div>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                    </div>
                </div>

                <a name="4.-proposed-wording-preview-informative" href="#4.-proposed-wording-preview-informative"><h2>4. Proposed Wording Preview (informative)</h2></a>

                <p>This wording is relative to <strong>[N4687]</strong>.</p>

                <a name="4.1-option-a-sfinae-friendly" href="#4.1-option-a-sfinae-friendly"><h3>4.1 Option A, SFINAE-friendly</h3></a>

                <blockquote>
                    <div>
                        <div id="highlighter_560012" class="syntaxhighlighter nogutter  cpp">
                            <table border="0" cellspacing="0" cellpadding="0">
                                <tbody>
                                    <tr>
                                        <td class="code">
                                            <div class="container">
                                                <div class="line number1 index0 alt2"><code class="cpp keyword bold">template</code> <code class="cpp plain">&lt;</code><code class="cpp color1 bold">size_t</code> <code class="cpp plain">I, </code><code class="cpp keyword bold">class</code><code class="cpp plain">... Types&gt;</code></div>
                                                <div class="line number2 index1 alt1"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp keyword bold">constexpr</code> <code class="cpp plain">tuple_element_t&lt;I, tuple&lt;Types...&gt;&gt;&amp;</code></div>
                                                <div class="line number3 index2 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">get(tuple&lt;Types...&gt;&amp; t) </code><code class="cpp keyword bold">noexcept</code><code class="cpp plain">;</code></div>
                                            </div>
                                        </td>
                                    </tr>
                                </tbody>
                            </table>
                        </div>
                    </div>

                    <p><del style="background-color: #FFA0A0;">-X- <em>Requires</em>: <code>I &lt; sizeof...(Types)</code>. Otherwise, the program is ill-formed.</del></p>

                    <p><ins style="background-color: #A0FFA0;">-?- <em>Remarks</em>: This function shall not participate in overload resolution unless <code>I &lt; sizeof...(Types)</code>.</ins></p>

                    <div>
                        <div id="highlighter_309452" class="syntaxhighlighter nogutter  cpp">
                            <table border="0" cellspacing="0" cellpadding="0">
                                <tbody>
                                    <tr>
                                        <td class="code">
                                            <div class="container">
                                                <div class="line number1 index0 alt2"><code class="cpp keyword bold">template</code> <code class="cpp plain">&lt;</code><code class="cpp keyword bold">class</code> <code class="cpp plain">T, </code><code class="cpp keyword bold">class</code><code class="cpp plain">... Types&gt;</code></div>
                                                <div class="line number2 index1 alt1"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp keyword bold">constexpr</code> <code class="cpp plain">T&amp; get(tuple&lt;Types...&gt;&amp; t) </code><code class="cpp keyword bold">noexcept</code><code class="cpp plain">;</code></div>
                                            </div>
                                        </td>
                                    </tr>
                                </tbody>
                            </table>
                        </div>
                    </div>

                    <p><del style="background-color: #FFA0A0;">-Y- <em>Requires</em>: The type <code>T</code> occurs exactly once in <code>Types...</code>. Otherwise, the program is ill-formed.</del></p>

                    <p><ins style="background-color: #A0FFA0;">-?- <em>Remarks</em>: This function shall not participate in overload resolution unless the type <code>T</code> occurs exactly once in <code>Types...</code>.</ins></p>
                </blockquote>

                <a name="4.2-option-b-conditionally-deleted" href="#4.2-option-b-conditionally-deleted"><h3>4.2 Option B, Conditionally Deleted</h3></a>

                <blockquote>
                    <div>
                        <div id="highlighter_809985" class="syntaxhighlighter nogutter  cpp">
                            <table border="0" cellspacing="0" cellpadding="0">
                                <tbody>
                                    <tr>
                                        <td class="code">
                                            <div class="container">
                                                <div class="line number1 index0 alt2"><code class="cpp keyword bold">template</code> <code class="cpp plain">&lt;</code><code class="cpp color1 bold">size_t</code> <code class="cpp plain">I, </code><code class="cpp keyword bold">class</code><code class="cpp plain">... Types&gt;</code></div>
                                                <div class="line number2 index1 alt1"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp keyword bold">constexpr</code> <code class="cpp plain">tuple_element_t&lt;I, tuple&lt;Types...&gt;&gt;&amp;</code></div>
                                                <div class="line number3 index2 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">get(tuple&lt;Types...&gt;&amp; t) </code><code class="cpp keyword bold">noexcept</code><code class="cpp plain">;</code></div>
                                            </div>
                                        </td>
                                    </tr>
                                </tbody>
                            </table>
                        </div>
                    </div>

                    <p><del style="background-color: #FFA0A0;">-X- <em>Requires</em>: <code>I &lt; sizeof...(Types)</code>. Otherwise, the program is ill-formed.</del></p>

                    <p><ins style="background-color: #A0FFA0;">-?- <em>Remarks</em>: This function shall be defined as deleted unless <code>I &lt; sizeof...(Types)</code>.</ins></p>

                    <div>
                        <div id="highlighter_418716" class="syntaxhighlighter nogutter  cpp">
                            <table border="0" cellspacing="0" cellpadding="0">
                                <tbody>
                                    <tr>
                                        <td class="code">
                                            <div class="container">
                                                <div class="line number1 index0 alt2"><code class="cpp keyword bold">template</code> <code class="cpp plain">&lt;</code><code class="cpp keyword bold">class</code> <code class="cpp plain">T, </code><code class="cpp keyword bold">class</code><code class="cpp plain">... Types&gt;</code></div>
                                                <div class="line number2 index1 alt1"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp keyword bold">constexpr</code> <code class="cpp plain">T&amp; get(tuple&lt;Types...&gt;&amp; t) </code><code class="cpp keyword bold">noexcept</code><code class="cpp plain">;</code></div>
                                            </div>
                                        </td>
                                    </tr>
                                </tbody>
                            </table>
                        </div>
                    </div>

                    <p><del style="background-color: #FFA0A0;">-Y- <em>Requires</em>: The type <code>T</code> occurs exactly once in <code>Types...</code>. Otherwise, the program is ill-formed.</del></p>

                    <p><ins style="background-color: #A0FFA0;">-?- <em>Remarks</em>: This function shall be defined as deleted unless the type <code>T</code> occurs exactly once in <code>Types...</code>.</ins></p>
                </blockquote>

                <a name="4.3-option-c-deduced-return-type" href="#4.3-option-c-deduced-return-type"><h3>4.3 Option C, Deduced Return Type</h3></a>

                <blockquote>
                    <div>
                        <div id="highlighter_70604" class="syntaxhighlighter nogutter  cpp">
                            <table border="0" cellspacing="0" cellpadding="0">
                                <tbody>
                                    <tr>
                                        <td class="code">
                                            <div class="container">
                                                <div class="line number1 index0 alt2"><code class="cpp keyword bold">template</code> <code class="cpp plain">&lt;</code><code class="cpp color1 bold">size_t</code> <code class="cpp plain">I, </code><code class="cpp keyword bold">class</code><code class="cpp plain">... Types&gt;</code></div>
                                                <div class="line number2 index1 alt1"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp keyword bold">constexpr</code> <del style="background-color: #FFA0A0;"><code class="cpp plain">tuple_element_t&lt;I, tuple&lt;Types...&gt;&gt;&amp;</del></code><ins style="background-color: #A0FFA0;"><code class="cpp keyword bold">decltype</code><code class="cpp plain">(</code><code class="cpp keyword bold">auto</code><code class="cpp plain">)</code></ins></div>
                                                <div class="line number3 index2 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">get(tuple&lt;Types...&gt;&amp; t) </code><code class="cpp keyword bold">noexcept</code><code class="cpp plain">;</code></div>
                                            </div>
                                        </td>
                                    </tr>
                                </tbody>
                            </table>
                        </div>
                    </div>

                    <p>-X- <em>Requires</em>: <code>I &lt; sizeof...(Types)</code>. Otherwise, the program is ill-formed.</p>

                    <div>
                        <div id="highlighter_294256" class="syntaxhighlighter nogutter  cpp">
                            <table border="0" cellspacing="0" cellpadding="0">
                                <tbody>
                                    <tr>
                                        <td class="code">
                                            <div class="container">
                                                <div class="line number1 index0 alt2"><code class="cpp keyword bold">template</code> <code class="cpp plain">&lt;</code><code class="cpp keyword bold">class</code> <code class="cpp plain">T, </code><code class="cpp keyword bold">class</code><code class="cpp plain">... Types&gt;</code></div>
                                                <div class="line number2 index1 alt1"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp keyword bold">constexpr</code> <del style="background-color: #FFA0A0;"><code class="cpp plain">T&amp;</code></del><ins style="background-color: #A0FFA0;"><code class="cpp keyword bold">decltype</code><code class="cpp plain">(</code><code class="cpp keyword bold">auto</code><code class="cpp plain">)</code></ins> get(tuple&lt;Types...&gt;&amp; t) </code><code class="cpp keyword bold">noexcept</code><code class="cpp plain">;</code></div>
                                            </div>
                                        </td>
                                    </tr>
                                </tbody>
                            </table>
                        </div>
                    </div>

                    <p>-Y- <em>Requires</em>: The type <code>T</code> occurs exactly once in <code>Types...</code>. Otherwise, the program is ill-formed.</p>
                </blockquote>

                <a name="5.-references" href="#5.-references"><h2>5. References</h2></a>

                <ul>
                    <li>
                        <p>
                            <strong>[N4687]</strong> ISO/IEC JTC1 SC22 WG21, Programming Languages - C++, working draft, July 2017<br>
                            <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4687.pdf">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4687.pdf</a>
                        </p>
                    </li>
                    <li>
                        <p>
                            <strong>[LWG2974]</strong> Diagnose out of bounds <code>tuple_element</code>/<code>variant_alternative</code> - Agustín Bergé<br>
                            <a href="http://cplusplus.github.io/LWG/lwg-defects.html#2974">http://cplusplus.github.io/LWG/lwg-defects.html#2974</a>
                        </p>
                    </li>
                </ul>
            </article>
        </section>
</body>
</html>