首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >emplace和默认构造函数

emplace和默认构造函数
EN

Stack Overflow用户
提问于 2018-08-21 18:47:22
回答 2查看 964关注 0票数 5

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

代码语言:javascript
复制
#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;
}
EN

回答 2

Stack Overflow用户

发布于 2018-08-21 18:52:26

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

代码语言:javascript
复制
Element e(2.0, 3.0);

编译失败,因为没有这样的构造函数(Element e{2.0, 3.0}会跳过这样的构造函数调用)。但这正是emplace想要做的。要解决此问题,可以添加适当的构造函数:

代码语言:javascript
复制
struct Element
{
    Element(double a, double b) : a(a), b(b) {}

    double a;
    double b;
};
票数 4
EN

Stack Overflow用户

发布于 2018-08-21 18:58:03

或者,您可以选择不在Element中定义任何用户定义的ctor,而是使用那些无论如何仍然定义的ctor(除非显式删除):

代码语言:javascript
复制
    my_map.try_emplace("hello", Element{2.0, 3.0});
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51946980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档