emplace和默认构造函数

Mad*_*den 5 c++ stl perfect-forwarding emplace

鉴于以下代码,我很惊讶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;
}
Run Code Online (Sandbox Code Playgroud)

bip*_*pll 5

或者,您可以选择不定义任何用户定义的构造函数,Element而是使用无论如何仍然定义的构造函数(除非显式删除):

    my_map.try_emplace("hello", Element{2.0, 3.0});
Run Code Online (Sandbox Code Playgroud)


lub*_*bgr 4

这是因为emplace方法尝试用括号实例化元素,而不是通过聚合初始化。你可以验证一下

Element e(2.0, 3.0);
Run Code Online (Sandbox Code Playgroud)

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

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

    double a;
    double b;
};
Run Code Online (Sandbox Code Playgroud)