【问题标题】: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 是非联合类类型,则所有基类和非静态数据 成员初始化为零,所有填充初始化为零 位。构造函数(如果有)将被忽略。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 2013-10-09
      • 2015-05-04
      • 2017-06-30
      • 1970-01-01
      • 2012-08-04
      相关资源
      最近更新 更多