c ++将初始化列表传递给函数作为参数将构造一个对象?

时间:2015-01-08 16:35:21

标签: c++

这是我的代码:

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将输出正确的结果。但是怎么可能因为我没有实现一个接受初始化列表的构造函数。

4 个答案:

答案 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;
}