gpt4 book ai didi

c++ - 使用 C++11 的成员初始化列表中的初始化列表语法

转载 作者:太空狗 更新时间:2023-10-29 19:52:22 25 4
gpt4 key购买 nike

我一直在浏览“A Tour of C++” ' 并且 Bjarne 在构造函数的成员初始化中使用 c++11 初始化列表功能,就像这样(使用大括号):

A a;
B b;
Foo(Bar bar):
a{bar.a}, b{bar.b}
{}

然而,这不会在 c++11 之前编译。与旧的成员初始化器列表有什么区别(使用圆括号):

Foo(Bar bar):
a(bar.a), b(bar.b)
{}

那么有什么区别,什么时候应该优先选择另一个?

最佳答案

So what is the difference?

圆括号仅适用于非类类型,或具有适合括号中参数数量的构造函数的类型。

波浪花括号适用于这些,也适用于聚合 - 简单的 struct 或没有构造函数的数组类型。所以以下将起作用:

struct {
int a,b;
} aggregate;
int array[2];

Foo() : aggregate{1,2}, array{3,4} {}

最后,大括号将匹配采用适当类型的 initializer_list 的构造函数,而不是带有参数的构造函数来匹配参数。例如:

std::vector<int> v1;
std::vector<int> v2;

Foo() :
v1(10,2), // 10 elements with value 2
v2{10,2} // 2 elements with value 10,2
{}

when should one be preferred over the other?

如果您想更清楚地表明初始化是使用构造函数而不是聚合或initializer_list,请使用圆括号;或强制使用特定的构造函数。

当您需要一种不受其他方式支持的初始化形式时,请首选大括号;或者当您只是希望初始化“做正确的事”时。

在两者做同样事情的情况下,选择主要是审美。

关于c++ - 使用 C++11 的成员初始化列表中的初始化列表语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26804312/

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