我想使用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());
载体有类似的东西吗?
答案 0 :(得分:6)
vector::emplace_back()
将在向量的末尾构造,但也需要参数。
参数包可以为空。因此,可以不带参数调用可变参数模板emplace_back
;即。
vector<VeryLimitedClass> vec;
vec.emplace_back();
是通过其默认构造函数初始化类型VeryLimitedClass
的对象的有效代码,&#34; emplaces&#34;它位于vec
的后面。
答案 1 :(得分:3)
正如@dyp和@Casey在评论中指出的那样,std::emplace
不适用于Test类的向量,因为类不可移动因为&#34;用户声明的拷贝构造函数禁止生成默认的移动构造函数&#34; (@Casey)。
要在此处使用emplace
,该课程将需要移动。我们可以通过显式定义(和默认)移动构造函数来实现这一点:
public:
Test(Test&& other) = default;
Test& operator=(Test&& other) = default;
这也会隐含地使类不可复制&#34;因为声明移动操作会抑制隐式生成副本。&#34; (@Casey)
现在我们可以使用std::emplace_back()
然后使用vector::back()
来调用新创建的对象的方法。
答案 2 :(得分:0)
对于map
,简单:
std::map<int, Object> obj_map;
obj_map[10]; // default-constructs an object with key 10
否则,你也有所作为:
obj_map.emplace(std::piecewise_construct,
std::forward_as_tuple(10),
std::forward_as_tuple(args, to, construct, with));
[edit] vector
的等效内容为emplace_back
:
obj_vector.emplace_back(); // default construct
obj_vector.emplace_back(args, to, std::move(construct), with); // forward these