C++ named requirements: MoveInsertable (since C++11)

From cppreference.com

Specifies that an object of the type can be constructed into uninitialized storage from an rvalue of that type by a given allocator.

Requirements

Given the following types, values and expressions:

Type Definition Tan object type Aan allocator type Xa container type satisfying all following conditions: X::value_type is the same as T.

X::allocator_type is the same as std::allocator_traits<A>::rebind_alloc<T>.

Value Definition man lvalue of type Apa pointer of type T*Expression Definition rvan expression denoting an rvalue of type Texprstd::allocator_traits<A>::construct(m,p,rv)T is MoveInsertable into X if all following conditions are satisfied:

expr is well-formed.

Right after the evaluation of expr, the value of *p is equivalent to the value of rv before the evaluation.

Notes

If A is std::allocator<T>, then this will call placement new, as by ::new((void*)p)T(rv)(until C++20)std::construct_at(p,rv)(since C++20). This effectively requires T to be move constructible.

If std::allocator<T> or a similar allocator is used, a class does not have to implement a

move constructor

to satisfy this type requirement: a

copy constructor

that takes a constT& argument can bind rvalue expressions. If a MoveInsertable class implements a move constructor, it may also implement

move semantics

to take advantage of the fact that the value of rv after construction is unspecified.

Although it is required that customized construct is used when constructing elements of

std::basic_string

until C++23, all implementations only used the default mechanism. The requirement is corrected by

P1072R10

to match existing practice.

Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

DR Applied to Behavior as published Correct behavior

LWG 2177

C++11 evaluting expr did not have any postcondition added See also