我可以在没有赋值运算符的类型的向量中可靠地 emplace_back 吗?

rea*_*lly 1 c++ allocation vector move-constructor move-assignment-operator

我在 GCC、Clang 和 MSVC 中做了一些测试,发现emplace_back永远不会在包含的类上调用赋值运算符。它仅在重新分配时调用复制或移动构造函数。标准是否以某种方式保证这种行为?

用例是我有一些类按顺序存储在一个数字中,该数字只会随着时间的推移而增长,直到整个向量被破坏。我很乐意从赋值运算符中清除我的代码。

Fra*_*eux 5

这些要求记录在 cppreference.com 上。

为了std::vector<T>::emplace_back

类型要求

- T(容器的类型)必须满足和element的要求。MoveInsertableEmplaceConstructible

另外std::vector还有一个一般要求,即类型必须是Erasable.

EmplaceConstructible要求该类型可以使用给定的分配器并提供参数来构造。由于您使用的是默认分配器std::allocator<T>,这仅意味着该类型具有带有这些参数的可访问构造函数。

MoveInsertable要求该类型可以使用给定的分配器和类型的右值来构造T。这意味着std::allocator该类型具有可访问的移动构造函数。

Erasable要求该类型可以使用给定的分配器进行破坏。因为std::allocator这意味着它有一个可访问的析构函数。

就是这样(除了一些关于完整类型与不完整类型的规则)。没有提及赋值运算符的要求。

但在 C++11 之前,类型始终必须是CopyAssignableand CopyConstructible。此后这一情况有所放松。现在,除了 之外Erasable,要求仅取决于对向量执行的操作。