std::uninitialized_move 具有特定的分配器

std::uninitialized_move with specific allocator

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

另一种选择是在 for 循环中使用分配器移动构造对象,并在出现异常时销毁构造的对象。这基本上是用额外的功能重新实现 std::uninitialized_move()

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

我应该使用这个功能吗(可移植性)?或者还有其他更实用的选择吗? 也许标准库中有我遗漏的东西。

Should I use this functions (portability)?

您不应该使用 GCC 内部函数。

不,似乎没有标准的等效项。您可以编写这些函数的自己的版本。如果这样做,请注意 CustomAlloc::construct 是一个可选函数(例如,std::allocator 自 C++20 起就没有此函数),因此应该通过 std::allocator_traits<CustomAlloc>::construct 使用它。自 C++20 以来,这具有作为 constexpr 的额外好处。

Or is there other, more practical, option?

一种选择是忽略 CustomAlloc::construct 已被实施以执行除直接放置 new 之外的其他操作的可能性,从而简单地使用标准 std::uninitialized_move.

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