位置和默认构造函数

时间:2018-08-21 10:47:22

标签: c++ stl perfect-forwarding emplace

给出以下代码,令我惊讶的是,try_emplace无法使用主函数第一行中演示的默认构造函数,而是抱怨没有对Element::Element(double, double)的匹配函数调用。我是否误解了编译器创建默认构造函数的方式或try_emplace的用法?我当然可以通过为Element定义一个所有参数ctor来使这段代码起作用,但这似乎是多余的。

#include <string>
#include <map>

struct Element
{    
    double a;
    double b;
};

int main(int argc, char** argv)
{
    Element e {2.0, 3.0};

    std::map<std::string, Element> my_map;
    my_map.try_emplace("hello", 2.0, 3.0);

    return 0;
}

2 个答案:

答案 0 :(得分:4)

这是由于emplace方法试图用括号实例化元素,而不是通过聚合初始化来实例化。您可以验证

Element e(2.0, 3.0);

无法编译,因为没有这样的构造函数(Element e{2.0, 3.0}绕过了这样的构造函数调用)。但这是emplace试图做的。要解决此问题,您可以添加适当的构造函数:

struct Element
{
    Element(double a, double b) : a(a), b(b) {}

    double a;
    double b;
};

答案 1 :(得分:4)

或者,您可以选择不在Element中定义任何用户定义的ctor,而使用无论如何都被定义的ctor(除非明确删除):

    my_map.try_emplace("hello", Element{2.0, 3.0});