使用大括号初始值设定项的默认参数

Default argument using curly braces initializer

本文关键字:参数 默认      更新时间:2023-10-16

我有这段代码,似乎运行良好:

class foo{/* some member variables and functions*/};
void do_somthing(foo x={}){}
int main(){
  do_somthing();
}

我曾经使用 void do_somthing(foo x=foo()){} 来默认x参数,但我在某些书籍或在线示例中={}看到这种方式(不记得了)。完全可以使用它吗?这两种方法有什么区别吗?

foo x=foo()是复制初始化,

从另一个对象初始化一个对象

foo()是值初始化。

这是使用空初始值设定项构造变量时执行的初始化。

foo x={}是聚合初始化。

从大括号初始化列表初始化聚合

如果初始值设定项子句的数量小于 成员和基(自 C++17 起)或初始值设定项列表完全 为空,其余成员和碱基(自 C++17 起)初始化 通过其默认初始值设定项(如果在类定义中提供), 否则(自 C++14 起)通过空列表执行 值初始化

因此,在这种情况下,结果是相同的(两者都是值初始化的)。

在这种情况下,值初始化的效果是:

如果 T 是具有既非用户提供也不删除的默认构造函数的类类型(即,它可能是具有隐式定义或默认默认构造函数的类),则对象为零初始化

最后,在这种情况下,零初始化的效果是:

如果 T 是标量类型,则对象的初始值是积分 常量零显式转换为 T。

如果 T 是非联合类类型,则所有基类和非静态数据 成员初始化为零,所有填充初始化为零 位。构造函数(如果有)将被忽略。