c++ - 为什么要将类型 T 放置在需要 move 可构造的 vector 的末尾?

标签 c++ c++11 move stdvector move-semantics

为什么公共(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/

相关文章:

C++:检索映射值并插入到第二个映射中

c++ - Ubuntu 18.04 安装程序 clang++

c++ - 错误 C2064 : term does not evaluate to a function taking 1 argument - Lambda function

jQuery:将表格行 move 到第一个位置然后返回

c++ - 将 unique_ptr 的容器传递给构造函数?

c# - 从 C++ 返回到 C# 层时的位图可视化问题

c++ - 使用三元运算符从函数返回的统一初始化

c++ - 覆盖非虚函数

python - 如何获取小部件的当前 x 和 y 坐标?

c++ - 如何在运行 C++ 应用程序的 GUI 时设置断点购买 GDB