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

### 3527. `uses_allocator_construction_args` handles rvalue pairs of rvalue references incorrectly

Section: 20.2.8.2 [allocator.uses.construction] Status: WP Submitter: Tim Song Opened: 2021-02-27 Last modified: 2021-06-07

Priority: Not Prioritized

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

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

View all issues with WP status.

Discussion:

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 7.6.1.5 [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 20.2.8.2 [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,
   > > >                                                 forward_as_tuple(std::move(pr).firstget<0>(std::move(pr))),
   > > >                                                 forward_as_tuple(std::move(pr).secondget<1>(std::move(pr))));