3527. uses_allocator_construction_args handles rvalue pairs of rvalue references incorrectly

Section: [allocator.uses.construction] Status: C++23 Submitter: Tim Song Opened: 2021-02-27 Last modified: 2023-11-22 15:47:43 UTC

Priority: Not Prioritized

View all other issues in [allocator.uses.construction].

View all issues with C++23 status.


For an rvalue pair pr, uses_allocator_construction_args is specified to forward std::move(pr).first and std::move(pr).second. This is correct for non-references and lvalue references, but wrong for rvalue refrences because the class member access produces an lvalue (see [expr.ref]/6). get produces an xvalue, which is what is desired here.

[2021-03-12; Reflector poll]

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

[2021-06-07 Approved at June 2021 virtual plenary. Status changed: Voting → WP.]

Proposed resolution:

This wording is relative to N4878.

  1. Edit [allocator.uses.construction] as indicated:

    template<class T, class Alloc, class U, class V>
      constexpr auto uses_allocator_construction_args(const Alloc& alloc,
                                                      pair<U, V>&& pr) noexcept -> see below;


    -15- Effects: Equivalent to:

    return uses_allocator_construction_args<T>(alloc, piecewise_construct,