为了快速初始化小结构,我经常使用聚合初始化来保持代码小而简单:
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}); // ???
最佳答案
第一种情况是copy-list-initialization对于你的例子来说非常好。
function( { arg1, arg2, ... } ) ; (7)
7) in a function call expression, with braced-init-list used as an argument and list-initialization initializes the function parameter
所以对于 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
关于c++ - 可以使用 C++ 结构聚合初始化来创建临时实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43677403/