使用花括号初始化程序的默认参数

Hum*_*awi 4 c++ initialization default-arguments c++11

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

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

我以前用来void do_somthing(foo x=foo()){}默认x参数,但我={}在一些书或在线的例子中看到了这种方式(不记得了).使用它完全没问题吗?这两种方法有什么区别吗?

son*_*yao 8

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

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

并且foo()值初始化.

这是使用空初始化程序构造变量时执行的初始化.

foo x={}聚合初始化.

从braced-init-list初始化聚合

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

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

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

如果T是带有默认构造函数的类类型既不是用户提供的,也没有删除(即,它可以是与隐式定义的或默认的默认的构造一个类)时,对象是零初始化

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

如果T是标量类型,则对象的初始值是显式转换为T的整数常量零.

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