我想使用 vector::emplace
默认构造一个 不可复制 和 不可分配的 对象,然后使用迭代器对新创建的对象使用对象上的特定方法。请注意,该类没有参数化构造函数,只有默认构造函数。一个简单的例子是:
#include <iostream>
#include <vector>
using namespace std;
class Test {
public:
Test() {}
private:
Test(const Test&) = delete; // To make clas un-copyable.
Test& operator=(const Test&) = delete;
int a_;
};
int main() {
vector<Test> test_vec;
test_vec.emplace_back(); // <---- fails
return 0;
}
vector::emplace()
构造一个新对象,但需要非默认构造函数的参数。 vector::emplace_back()
将在向量的末尾构造。
有没有办法使用默认构造进行替换。有没有办法使用分段构造或默认转发,也许使用 std::piecewise_construct
就像地图一样?例如,在地图的情况下,我们可以使用:
std::map<int,Test> obj_map;
int val = 10;
obj_map.emplace(std::piecewise_construct,
std::forward_as_tuple(val),
std::forward_as_tuple());
向量有类似的东西吗?
原文由 Chizzy C 发布,翻译遵循 CC BY-SA 4.0 许可协议
正如@dyp 和@Casey 在评论中指出的那样,
std::emplace
不适用于 Test 类的向量,因为该类既不可 移动 也不可 复制,因为“用户声明的复制构造函数抑制了默认值的生成移动构造函数”(@Casey)。要在此处使用
emplace
,该类需要是可移动的或可复制的。我们可以通过显式定义(和默认)移动构造函数来使类可移动:这也将隐式地使类 不可复制,“因为声明移动操作将抑制副本的隐式生成”。 (@凯西)
现在我们可以使用
std::emplace_back()
然后使用vector::back()
调用新创建的对象的方法。