std :: uninitialized_move与特定的分配器

问题描述

我正在编写一个自定义容器模板类,该容器可以在stl中使用许多(如果不是全部)容器,可以使用指定的分配器类型。 要实现范围插入功能,我需要将容器中的某些元素向前移动多个空间,在这些空间中,内存仍未初始化。为此,我想使用std::uninitialized_move()的某些(不存在)版本,该版本在容器中使用分配器。

一个选择是在for循环中使用分配器对对象进行移动构造,并在发生异常的情况下销毁构造的对象。基本上,这是通过附加功能重新实现std::uninitialized_move()

我的编译器(GCC)的标准库实现完全具有我需要的功能std::__uninitialized_move_a()std::__uninitialized_copy_a()等),实际上已用于std容器的实现中,但是我认为这些是特定于编译器的。

我应该使用此功能(可移植性)吗?还是还有其他更实用的选择? 也许我在标准库中缺少某些东西。

解决方法

我应该使用此功能(可移植性)吗?

您不应该使用GCC内部功能。

不,似乎没有标准的等效物。您可以编写自己的那些功能的版本。如果这样做,请注意CustomAlloc::construct是一个可选函数(例如,std::allocator自C ++ 20起没有此函数),因此应通过std::allocator_traits<CustomAlloc>::construct使用它。从C ++ 20开始,这具有成为constexpr的其他好处。

或者还有其他更实用的选择吗?

一个选择是忽略实施CustomAlloc::construct来做直接放置新东西以外的事情的可能性,从而简单地使用标准std::uninitialized_move

从技术上讲,这从理论上限制了您的容器支持的分配器,但另一方面,我从未见过在实践中使用过这种自定义分配器。如果容器至少供内部使用,则这可能是合理的限制。如果这样做,请仔细记录行为。