【发布时间】:2019-01-27 13:00:06
【问题描述】:
鉴于以下代码,我很惊讶try_emplace 无法使用主函数第一行中演示的默认构造函数,而是抱怨没有对Element::Element(double, double) 的匹配函数调用。我是否误解了编译器创建默认构造函数的方式或try_emplace 的用法?我当然可以通过为Element 定义一个所有参数ctors 来让这段代码工作,但这似乎是多余的。
#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;
}
【问题讨论】:
-
编译器不会生成带参数的 c'tor,
try_emplace只会尝试调用 c'tor(没有聚合初始化)。 -
但是
Element e{2.0, 3.0}的定义从何而来? -
@Madden Element 是一个聚合(实际上是一个 POD),即使没有任何构造函数,也支持大括号初始化。我认为这是标准中的一个缺陷,它应该在 emplace_back 中有一个用于聚合的特殊代码。这会更加一致,也不那么令人惊讶。
-
由于未知原因,STL 对聚合的支持很差!
标签: c++ stl perfect-forwarding emplace