﻿<html>
<head>
    <meta charset="utf-8">
    <!-- TITLE -->
    <title>TriviallyCopyable reference_wrapper (Revision 1)</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: N4277<br>
                    Supersedes: N4151<br>
                    Date: 2014-11-06<br>
                    Project: Programming Language C++<br>
                    Reply-to: Agustín Bergé <a href="mailto:agustinberge@gmail.com">agustinberge@gmail.com</a>
                </p>
                <a href="#triviallycopyable-reference_wrapper-revision-1" name="triviallycopyable-reference_wrapper-revision-1"><h1>TriviallyCopyable reference_wrapper (Revision 1)</h1></a>
                <a href="#revision-history" name="revision-history"><h2>Revision History</h2></a>
                <p>Changes since <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4151.html" title="TriviallyCopyable reference_wrapper">N4151</a>:</p>
                <ul><li>LWG pointed out that <code>TriviallyCopyable</code> is not a thing, and suggested new wording.</li></ul>
                <a href="#1.-introduction" name="1.-introduction"><h2>1. Introduction</h2></a>
                <p>This paper proposes making <code>reference_wrapper&lt;T&gt;</code> be <code>TriviallyCopyable</code>.</p>
                <a href="#2.-motivation" name="2.-motivation"><h2>2. Motivation</h2></a>
                <p>Trivially copyable types make ideal candidates for the small buffer optimization. So does <code>reference_wrapper&lt;T&gt;</code>. <code>reference_wrapper&lt;T&gt;</code> should be trivially copyable.</p>
                <p>The simplest way to implement the small buffer optimization is by restricting it to trivially copyable types. Once objects of trivially copyable types are placed into suitable storage, the job is done as the compiler will fill in the details. With this rationale, the following trait can be used to decide when the optimization can be applied:</p>
                <div><div class="syntaxhighlighter nogutter  cpp" id="highlighter_815384"><table cellspacing="0" cellpadding="0" border="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">Buffer&gt;</code></div><div class="line number2 index1 alt1"><code class="cpp keyword bold">struct</code> <code class="cpp plain">use_small_buffer_optimization</code></div><div class="line number3 index2 alt2"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">: </code><code class="cpp color1 bold">std::integral_constant</code><code class="cpp plain">&lt;</code><code class="cpp color1 bold">bool</code><code class="cpp plain">,</code></div><div class="line number4 index3 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(T) &lt;= </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(Buffer)</code></div><div class="line number5 index4 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">&amp;&amp; </code><code class="cpp keyword bold">alignof</code><code class="cpp plain">(Buffer) % </code><code class="cpp keyword bold">alignof</code><code class="cpp plain">(T) == 0</code></div><div class="line number6 index5 alt1"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">&amp;&amp; </code><code class="cpp color1 bold">std::is_trivially_copyable</code><code class="cpp plain">&lt;T&gt;::value</code></div><div class="line number7 index6 alt2"><code class="cpp spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="cpp plain">&amp;&amp; </code><code class="cpp color1 bold">std::is_copy_constructible</code><code class="cpp plain">&lt;T&gt;::value</code></div><div class="line number8 index7 alt1"><code class="cpp plain">&gt; {};</code></div></div></td></tr></tbody></table></div></div>
                <p>This may or may not include <code>reference_wrapper&lt;T&gt;</code>, given that whether such template class is trivially copyable is unspecified. Yet <code>reference_wrapper&lt;T&gt;</code> would be an ideal candidate for the optimization, to the point that it is guaranteed to be used in <code>std::function</code>. Users may expect <code>reference_wrapper&lt;T&gt;</code> to be trivially copyable given that it is just a pointer in disguise. Depending on their standard library implementation, it will be trivially copyable, leading to unexpected allocations and possibly exceptions when switching to a different implementation.</p>
                <a href="#3.-implementability" name="3.-implementability"><h2>3. Implementability</h2></a>
                <p>The following is a trivial implementation of <code>reference_wrapper</code>, modulo the call wrapper related functionality:</p>
                <div><div class="syntaxhighlighter nogutter  cpp" id="highlighter_504866"><table cellspacing="0" cellpadding="0" border="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&gt;</code></div><div class="line number2 index1 alt1"><code class="cpp keyword bold">class</code> <code class="cpp plain">reference_wrapper {</code></div><div class="line number3 index2 alt2"><code class="cpp keyword bold">public</code><code class="cpp plain">:</code></div><div class="line number4 index3 alt1"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp comments">// types</code></div><div class="line number5 index4 alt2"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp keyword bold">typedef</code> <code class="cpp plain">T type;</code></div><div class="line number6 index5 alt1">&nbsp;</div><div class="line number7 index6 alt2"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp comments">// construct/copy/destroy</code></div><div class="line number8 index7 alt1"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">reference_wrapper(T&amp; ref) </code><code class="cpp keyword bold">noexcept</code> <code class="cpp plain">: _ptr(</code><code class="cpp color1 bold">std::addressof</code><code class="cpp plain">(ref)) {}</code></div><div class="line number9 index8 alt2"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">reference_wrapper(T&amp;&amp;) = </code><code class="cpp keyword bold">delete</code><code class="cpp plain">;</code></div><div class="line number10 index9 alt1"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">reference_wrapper(</code><code class="cpp keyword bold">const</code> <code class="cpp plain">reference_wrapper&amp;) </code><code class="cpp keyword bold">noexcept</code> <code class="cpp plain">= </code><code class="cpp keyword bold">default</code><code class="cpp plain">;</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 comments">// assignment</code></div><div class="line number13 index12 alt2"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">reference_wrapper&amp; </code><code class="cpp keyword bold">operator</code><code class="cpp plain">=(</code><code class="cpp keyword bold">const</code> <code class="cpp plain">reference_wrapper&amp; x) </code><code class="cpp keyword bold">noexcept</code> <code class="cpp plain">= </code><code class="cpp keyword bold">default</code><code class="cpp plain">;</code></div><div class="line number14 index13 alt1">&nbsp;</div><div class="line number15 index14 alt2"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp comments">// access</code></div><div class="line number16 index15 alt1"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp keyword bold">operator</code> <code class="cpp plain">T&amp; () </code><code class="cpp keyword bold">const</code> <code class="cpp keyword bold">noexcept</code> <code class="cpp plain">{ </code><code class="cpp keyword bold">return</code> <code class="cpp plain">*_ptr; }</code></div><div class="line number17 index16 alt2"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">T&amp; get() </code><code class="cpp keyword bold">const</code> <code class="cpp keyword bold">noexcept</code> <code class="cpp plain">{ </code><code class="cpp keyword bold">return</code> <code class="cpp plain">*_ptr; }</code></div><div class="line number18 index17 alt1">&nbsp;</div><div class="line number19 index18 alt2"><code class="cpp keyword bold">private</code><code class="cpp plain">:</code></div><div class="line number20 index19 alt1"><code class="cpp spaces">&nbsp;&nbsp;</code><code class="cpp plain">T* _ptr;</code></div><div class="line number21 index20 alt2"><code class="cpp plain">};</code></div></div></td></tr></tbody></table></div></div>
                <p>Particular attention should be given to the fact that the copy constructor and copy assignment operator are not user-provided. They are explicitly defaulted on the first declaration, another alternative is to have them be implicitly declared. Given that <code>reference_wrapper</code> has no virtual functions and no subobjects of class type, the implicit definitions provided by the implementation will be trivial. With no non-trivial special member functions and a trivial destructor, this implementation of <code>reference_wrapper</code> is trivially copyable.</p>
                <a href="#4.-impact-on-the-standard" name="4.-impact-on-the-standard"><h2>4. Impact on the Standard</h2></a>
                <p>The proposed change incurs no breaking changes, given that whether <code>reference_wrapper&lt;T&gt;</code> is trivially copyable is currently unspecified.</p>
                <a href="#5.-impact-on-abi-stability" name="5.-impact-on-abi-stability"><h2>5. Impact on ABI Stability</h2></a>
                <p>Some ABIs, like the Itanium ABI [ITA], treat types with non-trivial copy constructors differently. They require the caller to allocate space for a temporary copy in which to store the parameter or return value, and pass a pointer to the temporary to the function. This is thus a potential ABI breaking change for those implementations in which <code>reference_wrapper&lt;T&gt;</code> is not already <code>TriviallyCopyable</code>. The situation, at the point of this writing, is the following:</p>
                <ul>
                    <li><p>libc++ implementation is <code>TriviallyCopyable</code>.</p></li>
                    <li><p>libstdc++ implementation is <code>TriviallyCopyable</code>.</p></li>
                    <li><p>msvc implementation is not <code>TriviallyCopyable</code>, but does not guarantee ABI compatibility between major releases.</p></li>
                    <li><p>(annecdotical) Boost implementation is <code>TriviallyCopyable</code>.</p></li>
                </ul>
                <a href="#6.-proposed-wording" name="6.-proposed-wording"><h2>6. Proposed Wording</h2></a>
                <p>Add the following as a new paragraph after 20.9.3 [refwrap] paragraph 1 (relative to [N4140]):</p>
                <blockquote>
                    <p><ins markdown="1" style="background-color: #A0FFA0;"><code>reference_wrapper&lt;T&gt;</code> shall be a trivially copyable type.</ins></p>
                </blockquote>
                <a href="#7.-references" name="7.-references"><h2>7. References</h2></a>
                <ul>
                    <li>
                        [ITA] Itanium C++ ABI
                        <a href="http://mentorembedded.github.io/cxx-abi/abi.html">http://mentorembedded.github.io/cxx-abi/abi.html</a>
                    </li>
                </ul>
                <ul>
                    <li>
                        [N4140] ISO/IEC JTC1 SC22 WG21, Programming Languages - C++, working draft, October 2014
                        <a href="http://www.open-std.org/jtc1/sc22/wg21/prot/14882fdis/n4140.pdf">http://www.open-std.org/jtc1/sc22/wg21/prot/14882fdis/n4140.pdf</a>
                    </li>
                </ul>
            </article>
        </section>
    </div>

</body>
</html>
