C++ наимённые требования: MoveInsertable (с C++11)
Указывает, что объект типа может быть сконструирован в неинициализированное хранилище из rvalue того же типа с помощью заданного аллокатора.
Требования
Тип T является MoveInsertable в контейнер X, чьей value_type идентична T, если, учитывая
A | тип аллокатора |
m | lvalue типа A |
p | указатель типа T*, подготовленный контейнером |
rv | rvalue выражение типа T |
где X::allocator_type идентична std::allocator_traits<A>::rebind_alloc<T>,
следующее выражение является корректным:
std::allocator_traits<A>::construct(m, p, rv);
И после оценки, значение *p эквивалентно значению, ранее содержавшемуся в rv (rv остаётся валидным, но находится в неопределённом состоянии).
Если X не является aware-аллокатором или является специализацией std::basic_string, термин определяется как если бы A было std::allocator<T>, за исключением того, что не нужно создавать объект аллокатора, и пользовательские специализации std::allocator не инициализируются.
Примечания
Если A является std::allocator<T>, то это вызовет размещающее создание нового объекта, как и в ::new((void*)p) T(rv)(до C++20)std::construct_at(p, rv)(с C++20). Это фактически требует, чтобы T обладал move-конструктором.
Если используется std::allocator<T> или аналогичный аллокатор, классу не нужно реализовывать move-конструктор для удовлетворения этого требования: копирующий конструктор, принимающий const T& аргумент, может связывать rvalue-выражения. Если класс MoveInsertable реализует move-конструктор, он также может реализовать move-семантику для использования того факта, что значение rv после конструирования неопределено.
Хотя требуется использование настраиваемого construct при создании элементов std::basic_string до C++23, все реализации использовали только механизм по умолчанию. Это требование исправлено в P1072R10 для соответствия существующей практике.
См. также
| CopyInsertable |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/named_req/MoveInsertable