【问题标题】:Default argument using curly braces initializer使用花括号初始化器的默认参数
【发布时间】:2016-03-10 07:54:21
【问题描述】:
我有这段似乎运行良好的 sn-p 代码:
class foo{/* some member variables and functions*/};
void do_somthing(foo x={}){}
int main(){
do_somthing();
}
我曾经使用void do_somthing(foo x=foo()){} 来默认x 参数,但我在某些书籍或在线示例中看到这种方式={}(不记得了)。完全可以使用吗?这两种方法有区别吗?
【问题讨论】:
标签:
c++
c++11
initialization
default-arguments
【解决方案1】:
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 是非联合类类型,则所有基类和非静态数据
成员初始化为零,所有填充初始化为零
位。构造函数(如果有)将被忽略。