Способ C ++ для перемещения объекта неявно неподвижного класса - PullRequest
4 голосов
/ 22 апреля 2020

Я пишу какую-то пользовательскую библиотеку, такую ​​как 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/)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...