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

时间:2016-03-10 07:54:21

标签: c++ c++11 initialization default-arguments

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

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

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

1 个答案:

答案 0 :(得分:8)

foo x=foo()copy initialization

  

从另一个对象初始化对象

foo()value initialization

  

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

foo x={}aggregate initialization

  

从braced-init-list

初始化聚合      

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

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

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

  

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

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

  

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

     

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