title: Initialize a tuple of non-copyable and non-movable classes
body: <p>Consider class A with the only custom constructor:</p>
  
  <pre><code>class A
  {
  public:
      A(float) {}
  
  private:
      A() = delete;
      A(const A&amp;) = delete;
      A(A&amp;&amp;) = delete;
  };
  </code></pre>
  
  <p>And another class B, which contains a tuple of A (let it be the only tuple member for simplicity):</p>
  
  <pre><code>class B
  {
  public:
      B() : ta(0.0f) {} // ta initialization OK
  
  private:
      std::tuple&lt;A&gt; ta;
  };
  </code></pre>
  
  <p>Now we can declare an object of B and it works fine:</p>
  
  <pre><code>B b;
  </code></pre>
  
  <p>But how to do the same if the constructor of <code>A</code> has more than one argument?</p>
  
  <pre><code>class A
  {
  public:
      A(float, int) {}
  
  private:
      A() = delete;
      A(const A&amp;) = delete;
      A(A&amp;&amp;) = delete;
  };
  
  class B
  {
  public:
  //  B() : ta(0.0f, 1) {} // Compilation errors
  //  B() : ta({0.0f, 1}) {} // Compilation errors
  //  B() : ta{0.0f, 1} {} // Compilation errors
  //  B() : ta(A(0.0f, 1)) {} // No constructor to copy or move A
  
  private:
      std::tuple&lt;A&gt; ta;
  };
  
  B b;
  </code></pre>
  
  <p><code>std::make_tuple</code>, <code>std::forward_as_tuple</code> and others like that don't solve the problem, because default, copy and move constructors of <code>A</code> are disabled.</p>