我有以下构造函数:
MyItem(std::initializer_list<double> l) {
std::cout << "l size " << l.size() << ")" << std::endl;
}
稍后用双花括号调用:
MyItem{{}}
l.size() 给出的结果是 1。
这种行为背后的机制是什么?
看起来嵌套的 {} 就像唯一元素的默认构造函数一样,但我不太明白类型推导为什么以及如何在这里工作。
当您使用大括号(列表初始化)来初始化MyItem
对象,您显示的列表构造函数非常贪婪。
这些将传递一个空列表:
MyItem foo({});
MyItem foo{std::initializer_list<double>{}};
这传递了一个包含单个元素的列表 - 一个值初始化的double
(0.0):
MyItem foo{{}};
这是可行的,因为在某些情况下,您可以简单地使用大括号来代替已知类型。在这里,它通过首选列表构造函数知道给定列表应包含double
.
为了完整起见,这看起来像是传递了一个空列表,但实际上它是值初始化的foo
如果它有一个默认构造函数(或者在特殊情况下,执行几乎相同的操作)。如果没有默认构造函数,它将选择列表构造函数,如图所示 http://coliru.stacked-crooked.com/a/2c206fef140e35d8.
MyItem foo{};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)