rea*_*lly 1 c++ allocation vector move-constructor move-assignment-operator
我在 GCC、Clang 和 MSVC 中做了一些测试,发现emplace_back永远不会在包含的类上调用赋值运算符。它仅在重新分配时调用复制或移动构造函数。标准是否以某种方式保证这种行为?
用例是我有一些类按顺序存储在一个数字中,该数字只会随着时间的推移而增长,直到整个向量被破坏。我很乐意从赋值运算符中清除我的代码。
这些要求记录在 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,要求仅取决于对向量执行的操作。
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |