This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of Tentatively Ready status.

4477. Placement operator delete should be constexpr

Section: 17.6.3.4 [new.delete.placement] Status: Tentatively Ready Submitter: Jakub Jelinek Opened: 2025-11-18 Last modified: 2025-11-26

Priority: Not Prioritized

View other active issues in [new.delete.placement].

View all other issues in [new.delete.placement].

View all issues with Tentatively Ready status.

Discussion:

The P2747R2 paper made placement operator new constexpr. At that time constexpr exceptions weren't in C++26, so that was all that was needed. But later on when P3068R5 was voted in, the P2747R2 changes look insufficient. The problem is that when you throw from a constructor during operator new, it invokes placement operator delete. And P2747R2 didn't touch that.

This makes it impossible to handle an exception thrown by a placement new-expression during constant evaluation.

[2025-11-26; Reflector poll.]

Set status to Tentatively Ready after six votes in favour during reflector poll.

Proposed resolution:

This wording is relative to N5014.

  1. Modify 17.6.2 [new.syn] as indicated:

    constexpr void* operator new  (std::size_t size, void* ptr) noexcept;
    constexpr void* operator new[](std::size_t size, void* ptr) noexcept;
    constexpr void operator delete  (void* ptr, void*) noexcept;
    constexpr void operator delete[](void* ptr, void*) noexcept;
    
  2. Modify 17.6.3.4 [new.delete.placement] as indicated:

    constexpr void* operator new(std::size_t size, void* ptr) noexcept;
    

    […]

    constexpr void* operator new[](std::size_t size, void* ptr) noexcept;
    

    […]

    constexpr void operator delete(void* ptr, void*) noexcept;
    

    -7- Effects: Intentionally performs no action.

    -8- Remarks: Default function called when any part of the initialization in a placement new-expression that invokes the library's non-array placement operator new terminates by throwing an exception (7.6.2.8 [expr.new]).

    constexpr void operator delete[](void* ptr, void*) noexcept;
    

    -9- Effects: Intentionally performs no action.

    -10- Remarks: Default function called when any part of the initialization in a placement new-expression that invokes the library's array placement operator new terminates by throwing an exception (7.6.2.8 [expr.new]).