【问题标题】:What is this C++ C11 syntax: "= {}"?这个 C++ C11 语法是什么:“= {}”?
【发布时间】:2015-07-21 08:59:12
【问题描述】:

我在一个 c++ 文件中遇到了这种语法:

Obj obj = {};

它有什么作用?它只是调用默认构造函数吗?

【问题讨论】:

  • 视情况而定。如果Objint,则没有构造函数。
  • 这真的取决于赋值运算符是如何实现的。
  • @DavidHaim:不,它与任何赋值运算符完全无关。
  • 我刚刚注意到这个问题是关于 C++ 和 C 的。它们是两种截然不同的语言,每种语言的答案也大不相同!

标签: c++ c++11 uniform-initialization aggregate-initialization


【解决方案1】:

表达式周围的大括号表示值的聚合,{} 表示一个空值列表。

是的,{} 只是调用默认构造函数。 (它还确保所有成员都以某种方式初始化,即使该类没有提供默认构造函数。这称为“值初始化”。)

在 C++11 之前,它将对所有成员使用具有默认值的聚合初始化。但是,这已经与值初始化相同,即“调用默认构造函数”的行为。 (事实上​​,值初始化是 C++03 发明的一个概念,它允许面向构造函数的语法来表示已经存在于聚合类型中的东西。)

有一个小怪癖:它不会调用声明为explicit 的默认构造函数,而是会产生错误。解决方案是永远不要声明explicit 默认构造函数。如果您对这样的构造函数感到困惑,请摆脱 = 并说 Obj obj{}

【讨论】:

  • Obj obj() 是最令人头疼的解析,也就是说,它声明了一个名为 obj 的函数,它不带任何参数并返回一个 Obj
  • @KerrekSB 那么它不是默认可构造的。 (我错了联合,默认构造函数被隐式定义为删除。)初始化是一个复杂的世界......
  • 你对默认构造函数是正确的。类类型可以有隐式声明的;当没有默认构造函数用户提供时适用特殊值初始化规则。
【解决方案2】:

这种形式的初始化在 C++11 中称为 list-initialization,在 C++14 中称为 copy-list-initialization。它相当于 direct-list-initialization Obj obj{};(在 C++14 语言中),前提是所需的构造函数不是 explicit,它只是对对象进行值初始化。

(具体含义取决于Obj是基本类型还是类类型,以及为它声明了什么样的构造函数。)

【讨论】:

    【解决方案3】:

    对于 C,这种空 {} 的语法无效。对于有效的初始化程序,您至少需要一个字段值。 C 标准将 { 0 } 推广为通用的全零初始化器,相当于 C++ 的 {}

    【讨论】:

    • 等效,但应该注意的是,除了类似 C 的类型之外,这在 C++ 中通常不起作用。
    猜你喜欢
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2018-05-22
    • 2010-12-30
    • 1970-01-01
    相关资源
    最近更新 更多