首页 > 解决方案 > 不为 emplace() 定义构造函数的解决方法

问题描述

我们从 C++11 开始聚合初始化:

struct S {
    int count;
    double value;
};
S s{2, 3.0};

但为了这项工作:

vector<S> v;
v.emplace_back(2, 3.0);

我们需要无缘无故手动编写构造函数:

struct S {
    int count;
    double value;
    S(int count, double value): count(count), value(value) {}
};

我们还需要这个构造函数optional(in_place, ...)variant(in_place_type<>, ...)工作。

是否有不手动编写此构造函数的解决方法?

它不添加任何信息,只是重复已经存在的信息两次。编译器也可以自己编写它,就像它为聚合初始化所做的那样。

我能够将新的构造函数添加到允许这样做的 Egg 的变体中,但是我们可以在不修改容器源的情况下做一些事情吗?

编辑:这个问题:为什么 emplace_back() 不使用统一初始化?是相关的,但不提供解决方法。

标签: c++c++11

解决方案


您至少有一个可用的隐式构造函数。

std::vector<S> v;
v.emplace_back(S{2, 3.0});

emplace_back并且push_back在这种情况下可以互换。)


推荐阅读