On Tue, 28 Nov 2023 at 13:33, Jonathan Wakely <cxx@kayari.org> wrote:


On Tue, 28 Nov 2023 at 13:09, Frederick Virchanza Gotham <cauldwell.thomas@gmail.com> wrote:
On Tue, Nov 28, 2023 at 12:34 PM Jonathan Wakely wrote:
>
> You can just move the contained value to another object which you don't destroy. This doesn't need to be added to std::optional.


Your edict is discriminatory against enthusiasts of unmovable
user-defined classes:

    #include <mutex>
    #include <optional>

    std::mutex dummy1;

    alignas(std::mutex) char unsigned dummy2[sizeof(std::mutex)];

    int main(void)
    {
        std::optional< std::mutex > var;

        var.emplace();

        dummy1 = std::move( var.value() );                   // doesn't work
        ::new(dummy2) std::mutex( std::move(var.value()) );  // doesn't work
    }

So just construct a new object over the old one, e.g.

std::construct_at(&var);

This abandons the old one and creates a new empty optional over it.

There's no need to add a new member function for this niche use case.


Or use std::unique_ptr<std::mutex> instead of std::optional<std::mutex>, and then use release() to "abandon" it.

There are already several ways to do this niche thing if you really need it.