为什么公共(public)构造函数(和析构函数)不足以将 T
类型的对象放置在 vector 的后面?以下代码段格式错误。
#include <vector>
struct Foo {
Foo() {}
Foo(int) {}
~Foo() {}
Foo(const Foo&) = delete;
Foo& operator=(const Foo&) = delete;
};
int main() {
std::vector<Foo> vfoo(10);
vfoo.emplace_back();
}
emplace_back
要求 Foo
至少是可 move 构造的,并且此代码无法编译,因为 move 构造函数与复制构造函数一起被删除。但我想象 emplace_back
使用 placement new 调用默认构造函数。
最佳答案
在您的示例中, vector 由 10
元素构成。
然后你加一个。如果 capacity()
中没有更多空间,则必须分配一个新缓冲区,必须将已经存在的 10 个元素移入其中,然后追加新元素。
您会注意到上面的单词 move
—— 这就是您需要 move 构造函数的原因。
此外,即使您在那里没有元素,或者您仔细确保有足够的容量,编译器也无法知道: move 现有元素的代码将被编译(如果不运行)并且您将得到您的错误。
vector
中缺少“推回,我保证已经有容量”方法。那加上“设置容量,丢弃任何现有元素”将使您无需 move 构造函数(或复制构造函数回退)即可添加元素。在发明 emplace
之前,所有添加元素都需要一个拷贝或 move :并且在 C++11 之前,所有添加元素都需要一个拷贝。缺少这两种具有奇怪语义的方法只是为了允许不可 move 类型有限地使用 vector
并不奇怪。
我鼓励您编写一个具有这两个扩展(或类似的东西)的容器,并建议将其添加到 C++:它也可能有助于高性能用例(编译器只是证明我确实确保容量足够根据我的经验)。
关于c++ - 为什么要将类型 T 放置在需要 move 可构造的 vector 的末尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29586737/