给出以下代码,令我惊讶的是,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;
}
答案 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});