【发布时间】:2015-06-17 15:59:27
【问题描述】:
为什么公共构造函数(和析构函数)不能满足将T 类型的对象放置在向量的后面?以下 sn-p 格式不正确。
#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 至少是可移动构造的,并且此代码无法编译,因为移动构造函数与复制构造函数一起被删除。但我想象emplace_back 使用placement new 调用默认构造函数。
【问题讨论】:
-
当容器被调整大小并且需要复制现有内容时,您期望会发生什么?
-
参见en.cppreference.com/w/cpp/container/vector/emplace“参数”下的“类型要求”
-
@o11c
emplace和emplace_back是不同的东西,无论如何,问题是为什么会有这样的要求,而不是要求是什么。 -
因为它是这样定义的。就这么简单。
-
@DavidHaim。是的。问题是关于这样做的理由。
标签: c++ c++11 move stdvector move-semantics