gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:32:16 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com