我正在编写一些像 stl 这样的自定义库,但在 ctors 中没有分配,并且在资源拥有类中禁用了复制 ctors(因为环境不支持异常,堆上的所有分配都需要通过 retcode 检查)。
所以我从https://github.com/Kronuz/cpp-btree/移植 btree ,并且由于代码问题和我的方法一起被卡住了。
value_type与所有 stl 实现一样,是std::pair< const Key, Value>。const限定符使整个对隐式不可移动。
所以代码
x->construct_value(j, std::move(fields_.values[i]));
Run Code Online (Sandbox Code Playgroud)
( https://github.com/Kronuz/cpp-btree/blob/35ac0ec96f1fca1463765f169390059ab82d3aac/btree/btree.h#L615 )
实际上不会移动对象(返回 T& 而不是 T&&)并且
new (v) value_type(std::forward<Args>(args)...);
Run Code Online (Sandbox Code Playgroud)
( https://github.com/Kronuz/cpp-btree/blob/35ac0ec96f1fca1463765f169390059ab82d3aac/btree/btree.h#L883 )
正确地无法通过复制构造函数构造对。
有没有办法在没有或绕过复制移动语义的情况下在内存中重定位对象?当然,简单的解决方法是使std::pair< Key , Value>具有可变键,但这并不完全相同。
我找到了 Arthur O'Dwyer 提出的“trivially_realocable”提议,我得出的结论是,这正是关于这种情况的。( https://quuxplusone.github.io/blog/2018/07/18/annoucing-trivially-relocatable/ )