这是我的代码:
struct MyTest{
int a;
char b;
};
void testFunc(MyTest mt){
cout << mt.a << mt.b << endl;
}
void main(){
testFunc({ 1, 'c' });
}
似乎 mt将从initializer_list构造,testFunc将输出正确的结果。但是怎么可能因为我没有实现一个接受初始化列表的构造函数。
答案 0 :(得分:7)
此类是聚合 - 一个包含公共数据成员且没有用户定义的构造函数等的简单结构。
聚合类型支持列表初始化;初始化列表的元素用于依次初始化每个数据成员。 C和C ++中的变量初始化已经支持了很长时间:
MyTest x = {1, 'c'};
和C ++ 11将此扩展到list-initialisation的其他用法,包括(在这种情况下)初始化临时函数参数。
答案 1 :(得分:3)
正在进行列表初始化。由于(如在C中),您可以使用
初始化类型MyTest mt = {1, 'c'};
同样的初始化发生在呼叫点
(N3690)8.5 / 17 [...]
- 如果初始化程序是(非括号的)braced-init-list,则对象或引用是列表初始化的
8.5.4 / 3给出了例子:
struct S2 { // OK
int m1;
double m2, m3;
};
S2 s21 = { 1, 2, 3.0 }; // OK
使用初始化列表调用函数的行为方式相同。进一步:
(8.5.1 / 1)聚合是一个数组或类(第9条),没有用户提供的构造函数(12.1),没有私有或受保护的非静态数据成员(第11条),没有基类(第10条),没有虚函数(10.3)。当初始化程序列表初始化聚合时,如8.5.4中所述,初始化程序列表的元素将作为聚合成员的初始化程序,增加下标或成员顺序。
答案 2 :(得分:0)
在C ++ 11中,我们不必为POD定义构造函数。我们可以使用新的列表初始化语法:
MyTest mt{1, 'c'};
MyTest mt2 = {1, 'c'};
这就是您的代码中调用的内容。
答案 3 :(得分:-4)
好吧,首先你的主要功能是错误的:
int main() {
/* ... code ... here */
return 0;
}
其次,您需要一个对象来初始化您的结构:
#include <iostream>
struct Foo {
char _a;
int _b;
};
void print_them (const Foo& foo) {
std::cout << foo._a << ", " << foo._b << std::endl;
}
int main () {
/* create object and initialize it */
Foo f = {
'a', 7
};
/* call function */
print_them (f);
return 0;
}