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

标签 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}); // ???

最佳答案

第一种情况是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/

相关文章:

c++ - 如何修复 'no overloaded function takes 2 arguments' 错误 C++

c# - 使用 COM 将结构或字符串数​​组从 C++ 传递到 C#

c# - 在 C# 中构建结构时出错

c++ - C++ 中以 2 为基数的科学记数法(IEEE 32 位) float 的算法或代码?

C++ double *() () { } 重载?

c++ - SDL_SetVideoMode问题

c++ - 基于模板参数是否为 shared_ptr 的函数特化

c++ - 如何重载基于范围的std::list的解除引用运算符?

c - 为什么我在动态内存中得到错误的值?

c++ - 'if' 语句中的赋值和比较顺序