Namespaces
Variants

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

From cppreference.net
C++ named requirements

Указывает, что объект данного типа может быть скопирован на месте с помощью заданного аллокатора.

Требования

Даны следующие типы, значения и выражения:

Тип Определение
T тип объекта
A тип аллокатора
X тип контейнера, удовлетворяющий всем следующим условиям:
  • X::value_type совпадает с T .
  • X::allocator_type совпадает с std:: allocator_traits < A > :: rebind_alloc < T > .
Значение Определение
m lvalue типа A
p указатель типа T*
Выражение Определение
v выражение, обозначающее lvalue типа T / const T , или rvalue типа const T
expr std:: allocator_traits < A > :: construct ( m, p, v )

T является CopyInsertable в X , если выполняются все следующие условия:

  • T является MoveInsertable в X .
  • expr корректно сформировано.
  • Вычисление expr не изменяет значение v .
  • Сразу после вычисления expr значение v эквивалентно * p .

Примечания

Если A является std:: allocator < T > , тогда будет вызван placement new , как в :: new ( ( void * ) p ) T ( v ) (до C++20) std:: construct_at ( p, v ) (начиная с C++20) .

Хотя до C++23 требовалось использовать пользовательский construct при конструировании элементов std::basic_string , все реализации использовали только механизм по умолчанию. Требование исправлено P1072R10 для соответствия существующей практике.

Отчёты о дефектах

Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 2177 C++11 evaluting expr did not have any postcondition added
LWG 3957 C++11 v could denote an rvalue of type T excluded
Перевод:
DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 2177 C++11 вычисление expr не имело никакого постусловия добавлено
LWG 3957 C++11 v могло обозначать rvalue типа T исключено