3684. std::allocator<T>::allocate_at_least in constant evaluation

Section: 20.2.10.2 [allocator.members] Status: New Submitter: Jiang An Opened: 2022-03-22 Last modified: 2022-05-17

Priority: 3

View all other issues in [allocator.members].

View all issues with New status.

Discussion:

std::allocator<T>::allocate_at_least is a constexpr function that allocates memory during constant evaluation, but its restrictions is not clear. Presumably the restrictions are same as those of std::allocator<T>::allocate, and we should specify allocate_at_least in term of allocate.

The MSVC STL implementation returns allocation_result<T*>{allocate(n), n} now. Perhaps we should adopt this strategy for constant evaluation to avoid additional mechanism in the compiler.

[2022-05-17; Reflector poll]

Set priority to 3 after reflector poll. Suggestion to fix this in Core instead.

Proposed resolution:

This wording is relative to N4910.

  1. Modify 20.2.10.2 [allocator.members] as indicated:

    [[nodiscard]] constexpr allocation_result<T*> allocate_at_least(size_t n);
    

    -6- Mandates: T is not an incomplete type (6.8.1 [basic.types.general]).

    -7- Returns: allocation_result<T*>{ptr, count}, where ptr is a pointer to the initial element of an array of count T and count ≥ n.

    -8- Throws: bad_array_new_length if numeric_limits<size_t>::max() / sizeof(T) < n, or bad_alloc if the storage cannot be obtained.

    -9- Remarks: The storage for the array is obtained by calling ::operator new, but it is unspecified when or how often this function is called. This function starts the lifetime of the array object, but not that of any of the array elements. This function returns allocation_result<T*>{allocate(n), n} within the evaluation of a core constant expression.