使用默认构造函数在向量中进行安装

时间:2014-11-21 18:26:15

标签: c++ c++11 vector emplace

我想使用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());

载体有类似的东西吗?

3 个答案:

答案 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