Copy/MoveInsertableSection: 23.2.2 [container.requirements.general] Status: C++14 Submitter: Loïc Joly Opened: 2012-08-10 Last modified: 2017-09-07
Priority: Not Prioritized
View other active issues in [container.requirements.general].
View all other issues in [container.requirements.general].
View all issues with C++14 status.
Discussion:
See also discussion following c++std-lib-32883 and c++std-lib-32897.
The requirements onCopyInsertable and MoveInsertable are either incomplete, or complete but hard to
figure out.
From e-mail c++std-lib-32897:
Pablo Halpern:
I agree that we need semantic requirements for all of the *Insertable concepts analogous to the requirements
we have on similar concepts.
Howard Hinnant:
I've come to believe that the standard is actually correct as written in this area. But it is really hard
to read. I would have no objection whatsoever to clarifications to CopyInsertable as you suggest (such as the
post-conditions on v). And I do agree with you that the correct approach to the clarifications is to
confirm that CopyInsertable implies MoveInsertable.
[2012, Portland: Move to Tentatively Ready]
Move to Tentatively Ready by unanimous consent.
[2013-04-20 Bristol]
Proposed resolution:
This wording is relative to N3376.
Edit 23.2.2 [container.requirements.general] p13 as indicated:
-13- […] Given a container type
Xhaving anallocator_typeidentical toAand avalue_typeidentical toTand given an lvaluemof typeA, a pointerpof typeT*, an expressionvof type (possiblyconst)T, and an rvaluervof typeT, the following terms are defined. IfXis not allocator-aware, the terms below are defined as ifAwerestd::allocator<T>— no allocator object needs to be created and user specializations ofstd::allocator<T>are not instantiated:
TisDefaultInsertableintoXmeans that the following expression is well-formed:allocator_traits<A>::construct(m, p);An element of
Xis default-inserted if it is initialized by evaluation of the expressionallocator_traits<A>::construct(m, p);where
pis the address of the uninitialized storage for the element allocated withinX.
TisintoCopyMoveInsertableXmeans that the following expression is well-formed:allocator_traits<A>::construct(m, p, rv);and when evaluated the following postconditions hold: The value of
*pis equivalent to the value ofrvbefore the evaluation. [Note:rvremains a valid object. Its state is unspecified — end note]
TisintoMoveCopyInsertableXmeans that, in addition to satisfying theMoveInsertablerequirements, the following expression is well-formed:allocator_traits<A>::construct(m, p,rv);and when evaluated the following postconditions hold: The value of
vis unchanged and is equivalent to*p.
TisEmplaceConstructibleintoXfromargs, for zero or more argumentsargs, means that the following expression is well-formed:allocator_traits<A>::construct(m, p, args);
TisErasablefromXmeans that the following expression is well-formed:allocator_traits<A>::destroy(m, p);[Note: A container calls
allocator_traits<A>::construct(m, p, args)to construct an element atpusingargs. The default construct instd::allocatorwill call::new((void*)p) T(args), but specialized allocators may choose a different definition. — end note]