title: Why `std:variant`'s `operator=(T&& t)`'s noexcept spec doesn't depend on inner types's destructor's noexcept spec?
body: <p>Long title: Why <code>std:variant</code>'s <code>operator=(T&amp;&amp; t)</code>'s noexcept specification doesn't depend on inner types's destructor's noexcept specification?</p>
  
  <p>I can see on <a href="https://en.cppreference.com/w/cpp/utility/variant/operator%3D" rel="nofollow noreferrer">cppreference</a> that </p>
  
  <pre><code>template &lt;class T&gt; variant&amp; operator=(T&amp;&amp; t) noexcept(/* see below */);
  </code></pre>
  
  <p>is</p>
  
  <pre><code>noexcept(std::is_nothrow_assignable_v&lt;T_j&amp;, T&gt; &amp;&amp; 
  std::is_nothrow_constructible_v&lt;T_j, T&gt;)
  </code></pre>
  
  <p>So this compiles:</p>
  
  <pre><code>struct FooThrow {
    ~FooThrow() noexcept(false) {throw;} 
  };
  static_assert(std::is_nothrow_assignable_v&lt;std::variant&lt;FooThrow, int&gt;, int&gt;);
  </code></pre>
  
  <p>But it calls <code>FooThrow</code>'s destructor which is <code>noexcept(false)</code>:</p>
  
  <pre><code>std::variant&lt;FooThrow, int&gt; x;
  x = 3; // throws
  </code></pre>
  
  <p>It doesn't seem right. Am I missing something?</p>