I got so worried about accidentally deep-copying stuff that I ended up with an ugly C++ hack:<p><pre><code>    C(const C &amp;) = delete;
    C &amp;operator=(const C &amp;) = delete;
    C(C &amp;&amp;) noexcept = default;
    C &amp;operator=(C &amp;&amp;) noexcept = default;

    struct MakeCopy {
        const C &amp;src;
        MakeCopy(const C &amp;src) : src(src) { }
    };

    MakeCopy make_copy() const { return *this; }
    C(MakeCopy src) : field1(src.src.field1), (blah blah) { }
</code></pre>
Then, when you really want to copy stuff, you have to say &quot;a = b.make_copy();&quot;.<p>This isn&#x27;t really clean, because it&#x27;s too easy to add a field to C and then forget to add it to the &quot;manual copy constructor&quot;, but so far I found it good enough for me.