title: std::optional taking non-copyable?
body: <p>Suppose i have something akin to this <strong>pseudocode</strong>:</p>
  
  <pre><code>std::optional&lt;std::pair&lt;double*, std::scope_lock&lt;std::mutex&gt; &gt; &gt; getDataTogetherWithLock() {
    if (!some_ptr) {
      return std::nullopt;
    }
    return some_ptr-&gt;getDataTogetherWithLock();//just returns std::pair&lt;double*, std::scope_lock&lt;std::mutex&gt; &gt;
  }
  </code></pre>
  
  <p>This won't work, basicly if tried with real code will give an error about the return type cannot be converted to <code>std::optional</code>.</p>
  
  <p>What's the best way to solve this conundrum ?</p>