为了快速初始化小结构,我经常使用聚合初始化来保持代码小而简单:
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}); // ???
答案 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});
}
第一个调用是隐式的,第二个是显式的;都工作。如果您有模板函数或者不容易发生隐式转换的东西,那么您应该使用第二种形式。
答案 2 :(得分:0)
是的,您可以使用myFunc({1, 2, 3});
。