Namespaces
Variants

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

From cppreference.net
C++ named requirements

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

Содержание

Требования

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

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

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

  • expr является корректным выражением.
  • Сразу после вычисления expr , значение * p эквивалентно значению rv до вычисления.

Примечания

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

Если используется std:: allocator < T > или аналогичный аллокатор, классу не требуется реализовывать move constructor для выполнения этого требования типа: copy constructor , принимающий аргумент const T & , может связывать rvalue выражения. Если класс MoveInsertable реализует move constructor, он также может реализовывать move semantics , чтобы использовать преимущество того факта, что значение rv после конструирования не определено.

Хотя до 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
Перевод текста на веб-странице на русский язык:
DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 2177 C++11 вычисление expr не имело никакого постусловия добавлено

Смотрите также

CopyInsertable