title: Default move constructor/assignment and deleted copy constructor/assignment
body: <p>According to the standard,</p>
  <blockquote>
  <p>If the definition of a class X does not explicitly declare a move constructor, one will be implicitly declared as defaulted if and only if</p>
  <p>— X does not have a user-declared copy constructor,</p>
  <p>— X does not have a user-declared copy assignment operator,</p>
  <p>— X does not have a user-declared move assignment operator, and</p>
  <p>— X does not have a user-declared destructor.</p>
  </blockquote>
  <p>Now the following fails to compile</p>
  <pre><code># include &lt;utility&gt;
  
  class Foo
  {
  public:
    Foo() = default;
    Foo(Foo const &amp;) = delete;
  };
  
  int main()
  {
    Foo f;
    Foo g(std::move(f)); // compilation fails here
    return 0;
  }
  </code></pre>
  <p>So it seems that a deleted function is considered as user-defined, which makes sense (it is not its default implementation). However, in that particular case, how would deleted copy construtor/assignment mess default move constructor/assignment?</p>
  <p>I think this question has practical importance because manual generation and esp. maintenance of such default functions is error prone, while at the same time, the (righteous) increase of the use of classes such as <code>std::unique_ptr</code> as class members made non-copyable classes much more common beasts than they used to be.</p>