5

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

#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;
}
4

2 回答 2

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;
};
于 2018-08-21T10:52:26.350 回答
4

或者,您可以选择不定义任何用户定义的ctors,Element而是使用那些无论如何都定义的ctors(除非明确删除):

    my_map.try_emplace("hello", Element{2.0, 3.0});
于 2018-08-21T10:58:02.753 回答