2511. scoped_allocator_adaptor piecewise construction does not require CopyConstructible

Section: 23.13.4 [allocator.adaptor.members] Status: New Submitter: David Krauss Opened: 2015-06-16 Last modified: 2016-11-08

Priority: 3

View all other issues in [allocator.adaptor.members].

View all issues with New status.

Discussion:

23.13.4 [allocator.adaptor.members]/10 requires that the argument types in the piecewise-construction tuples all be CopyConstructible. These tuples are typically created by std::forward_as_tuple, such as in ¶13. So they will be a mix of lvalue and rvalue references, the latter of which are not CopyConstructible.

My guess is that CopyConstructible was specified to feed the tuple_cat, before that function could handle rvalues. Since the argument tuple is already moved in ¶11, the requirement is obsolete. It should either be changed to MoveConstructible, or perhaps better, convert the whole tuple to references (i.e. form tuple<Args1&&...>) so nothing needs to be moved. After all, this is a facility for handling non-movable types.

It appears that the resolution of DR 2203, which added std::move to ¶11, simply omitted the change to ¶10.

[2016-11-08, Jonathan comments]

My paper P0475R0 provides a proposed resolution.

Proposed resolution: