可以使用C ++ struct聚合初始化来创建临时实例吗?

时间:2017-04-28 09:59:18

标签: c++ c++11 struct initialization

为了快速初始化小结构,我经常使用聚合初始化来保持代码小而简单:

struct Foo {
    int a;
    int b;
    int c;
};
Foo temp = {1, 2, 3};

我认为这也应该可以创建一个临时实例,可以作为函数参数传递:

void myFunc(Foo foo) {
    // ...
}

这可能吗?如何使用此功能的确切语法?

myFunc({1, 2, 3}); // ???
myFunc(Foo {1, 2, 3}); // ???

3 个答案:

答案 0 :(得分:2)

第一种情况是copy-list-initialization,你的例子非常好。

  

function({arg1,arg2,...}); (7)

     

7)在函数调用表达式中,使用braced-init-list作为参数,list-initialization初始化函数参数

因此对于myFunc({1, 2, 3});myFunc需要Foo;然后,braced-init-list {1, 2, 3}将用于复制列表初始化临时Foo并作为参数传递给myFunc

对于myFunc(Foo {1, 2, 3});,临时Foo将被显式地直接列表初始化,然后作为参数传递给myFunc

直接列表初始化和复制列表初始化之间存在一些细微差别,例如: explicit转换构造函数不考虑复制列表初始化:

struct Foo {
    // explicit converting constructor
    explicit Foo(int, int, int) {}
    int a;
    int b;
    int c;
};

void myFunc(Foo foo) {
    // ...
}

myFunc({1, 2, 3});      // fail, can't convert from braced-init-list to Foo
myFunc(Foo {1, 2, 3});  // fine

答案 1 :(得分:1)

这个为我编写的小程序:

#include <iostream>

struct Foo {
    int a;
    int b;
    int c;
};

void bar(const Foo&) {}


int main() {
    bar({1,2,3});
    bar(Foo{1,2,3});
}

第一个调用是隐式的,第二个是显式的;都工作。如果您有模板函数或者不容易发生隐式转换的东西,那么您应该使用第二种形式。

实例:http://coliru.stacked-crooked.com/a/13c9fb9e277be697

答案 2 :(得分:0)

是的,您可以使用myFunc({1, 2, 3});