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)
或者,您可以选择不定义任何用户定义的构造函数,Element而是使用无论如何仍然定义的构造函数(除非显式删除):
my_map.try_emplace("hello", Element{2.0, 3.0});
Run Code Online (Sandbox Code Playgroud)
这是因为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)
| 归档时间: |
|
| 查看次数: |
288 次 |
| 最近记录: |