Date
2013-04-19.22:36:19
Message id
6483

Content

Proposed resolution:

This wording is relative to N3376.

  1. Edit [container.requirements.general] p13 as indicated:

    -13- […] Given a container type X having an allocator_type identical to A and a value_type identical to T and given an lvalue m of type A, a pointer p of type T*, an expression v of type (possibly const) T, and an rvalue rv of type T, the following terms are defined. If X is not allocator-aware, the terms below are defined as if A were std::allocator<T> — no allocator object needs to be created and user specializations of std::allocator<T> are not instantiated:

    • T is DefaultInsertable into X means that the following expression is well-formed:

      allocator_traits<A>::construct(m, p);
      
    • An element of X is default-inserted if it is initialized by evaluation of the expression

      allocator_traits<A>::construct(m, p);
      

      where p is the address of the uninitialized storage for the element allocated within X.

    • T is CopyMoveInsertable into X means that the following expression is well-formed:

      allocator_traits<A>::construct(m, p, rv);
      

      and when evaluated the following postconditions hold: The value of *p is equivalent to the value of rv before the evaluation. [Note: rv remains a valid object. Its state is unspecified — end note]

    • T is MoveCopyInsertable into X means that, in addition to satisfying the MoveInsertable requirements, the following expression is well-formed:

      allocator_traits<A>::construct(m, p, rv);
      

      and when evaluated the following postconditions hold: The value of v is unchanged and is equivalent to *p.

    • T is EmplaceConstructible into X from args, for zero or more arguments args, means that the following expression is well-formed:

      allocator_traits<A>::construct(m, p, args);
      
    • T is Erasable from X means 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 at p using args. The default construct in std::allocator will call ::new((void*)p) T(args), but specialized allocators may choose a different definition. — end note]