Я пишу какую-то пользовательскую библиотеку, такую как stl, но без выделения в ctors и с отключенными копиями ctors в классах, владеющих ресурсами (поскольку среда не поддерживает исключения, и все выделения в куче должны проверяться с помощью retcode).
Итак, я портирую btree с https://github.com/Kronuz/cpp-btree/ и застрял из-за проблемы с кодом в связи с моим подходом.
value_type, как и во всех реализациях stl, это std :: pair <<strong> const Key, Value> . Спецификатор const делает всю пару неявно неподвижной.
Итак, код
x->construct_value(j, std::move(fields_.values[i]));
(https://github.com/Kronuz/cpp-btree/blob/35ac0ec96f1fca1463765f169390059ab82d3aac/btree/btree.h#L615)
фактически не перемещает объект (возвращает T & вместо T &&) и
new (v) value_type(std::forward<Args>(args)...);
(https://github.com/Kronuz/cpp-btree/blob/35ac0ec96f1fca1463765f169390059ab82d3aac/btree/btree.h#L883)
по праву не может создать пару путем копирования ctor.
Есть ли способ перемещения объекта в памяти без или без обхода копирования-перемещения semanti c? Конечно, простой обходной путь - сделать std :: pair <<strong> Key , Value> с изменяемым ключом, но это не совсем то же самое.
Я нашел " тривиально-реальное »предложение Артура О'Дуайера, и я сделал вывод, что это именно то, что нужно. (https://quuxplusone.github.io/blog/2018/07/18/announcing-trivially-relocatable/)