title: Why does gcc warn about calling a non-trivial move assignment operator with std::tuple and virtual inheritance?
body: <p>In the following example gcc 7 gives a warning:</p>
  
  <blockquote>
    <p>defaulted move assignment for 'B' calls a non-trivial move assignment
    operator for virtual base 'A' [-Wvirtual-move-assign]</p>
  </blockquote>
  
  <p>if I create an <code>std::tuple&lt;B&gt;</code> object. Clang 5 doesn't report any problems. Also the problem goes away if <code>vector</code> is removed from <code>Base</code>. <a href="https://godbolt.org/g/sddCzK" rel="noreferrer">Example</a>.</p>
  
  <pre><code>#include &lt;tuple&gt;
  #include &lt;vector&gt;
  
  class Base
  {
  public:
      virtual ~Base();
      std::vector&lt;int&gt; v;
  };
  
  class A : public Base
  {
  };
  
  class B : public virtual A
  {
  };
  
  int main()
  {
      B *b = new B;
      B another{*b}; // &lt;&lt;&lt;--- this compiles
      std::tuple&lt;B&gt; t; // &lt;&lt;&lt;--- gives warning
  }
  </code></pre>
  
  <p>Why does it happen in presence of <code>std::tuple</code> (and absence of move assignment) and what is the proper way to fix it if I need to keep such a hierarchy?</p>