Why is the move-constructor of std::optional not deleted when T is not move-constructible? : <p>According to the standard, the copy-constructor of <code>std::optional&lt;T&gt;</code>:</p>

<blockquote>
  <p>...shall be defined as deleted unless <code>is_copy_constructible_v&lt;T&gt;</code> is <code>true</code>.</p>
</blockquote>

<p>But the move-constructor of <code>std::optional&lt;T&gt;</code>:</p>

<blockquote>
  <p>...shall not participate in overload resolution unless <code>is_move_constructible_v&lt;T&gt;</code> is <code>true</code>.</p>
</blockquote>

<p>As I <a href="https://stackoverflow.com/questions/14085620/why-do-c11-deleted-functions-participate-in-overload-resolution">understand deleted constructors</a>, the purpose of not-deleting the move-constructor of <code>std::optional&lt;T&gt;</code> would be to allow code like this:</p>

<pre><code>std::optional&lt;X&gt; o1;
std::optional&lt;X&gt; o2(std::move(o1));
</code></pre>

<p>...to work relying on some conversion sequence - <code>o2</code> would be constructed by an object of type <code>A</code> that has been constructed using a <code>std::optional&lt;X&gt;&amp;&amp;</code> (correct me if I am wrong).</p>

<p>But regarding the possible constructors of <code>std::optional</code>, I have a hard time figuring out one that could match this use case...</p>

<p><strong>Why is the move-constructor of <code>std::optional&lt;T&gt;</code> simply not <em>deleted</em> if <code>T</code> is not move-constructible?</strong></p>
