考虑到下面的代码,我很惊讶try_emplace不能使用main函数第一行中演示的默认构造函数,而是抱怨没有匹配的函数调用到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;
}发布于 2018-08-21 18:52:26
这是因为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-21 18:58:03
或者,您可以选择不在Element中定义任何用户定义的ctor,而是使用那些无论如何仍然定义的ctor(除非显式删除):
my_map.try_emplace("hello", Element{2.0, 3.0});https://stackoverflow.com/questions/51946980
复制相似问题