C++ Logo

std-proposals

Advanced search

Re: [std-proposals] Replace an object -- but retain old object if new object fails to construct

From: Sebastian Wittmeier <wittmeier_at_[hidden]>
Date: Mon, 27 Oct 2025 11:52:06 +0100
 - Not all class objects have a moved-from state  - Some objects need tidying up even in their moved-from state, e.g. freeing memory from the heap  - Some objects can't even store a flag; to add id nevertheless, why not use std::optional?   your 3 changes work with std::optional<T>: 1) destruction of a known-to-be-empty std::optional will be optimized to a no-op 2) getting an empty std::optional is possible 3) creating/emplacing an empty std::optional in raw memory is possible   What you probably want instead is an in-band signalled optional interface. There sure are some C++ papers for it? Like a HANDLE; and 0, or -1, or nullptr signals empty. And the zero HANDLE can just be destructed as a NO-OP whereas the valid HANDLE needs deallocation or closing some hardware interface.   -----Ursprüngliche Nachricht----- Von:Frederick Virchanza Gotham via Std-Proposals <std-proposals_at_[hidden]> Gesendet:Mo 27.10.2025 11:48 Betreff:Re: [std-proposals] Replace an object -- but retain old object if new object fails to construct An:std-proposals_at_[hidden]; CC:Frederick Virchanza Gotham <cauldwell.thomas_at_[hidden]>; On Fri, Oct 24, 2025 at 4:08 PM Thiago Macieira wrote: > > std::optional already guarantees that. My original use case used 'optional', but then Arthur came in and made it more generic with a function as follows:    template<typename T, typename... Params>    void replace(T*, Params&&...); and so sometimes we might want to be certain that the object is safe to destroy. I'm going off on a bit of a tangent here, but with regard to objects that have been moved from, I wonder would the following three changes be welcome in the language? Change No. 1:    The destruction of a moved-from object should always be equivalent to a no-op and can therefore be elided Change No. 2:    A new consteval standard library function that returns a moved-from PRvalue:    template<typename T>    requires (!is_reference_v<T>)    consteval T moved_from(void)    {        . . .    } Change No. 3:    A new constexpr standard library function that emplaces a moved-from object:    template<typename T>    requires (!is_reference_v<T>)    void emplace_moved_from(void *const p)    {        assert( 0 == (reinterpret_cast<uintptr>(p) % alignof(T)) );        . . .    } -- Std-Proposals mailing list Std-Proposals_at_[hidden] https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals

Received on 2025-10-27 11:05:16