【问题标题】:What is the effect of default initialization for a union instance?联合实例的默认初始化有什么影响?
【发布时间】:2015-07-21 15:50:05
【问题描述】:

cpp reference 之后,我会理解在 C++11 之前的行为是让它未初始化(如果联合是 POD 类型,这很可能),而无论如何它都会调用一个默认构造函数,从 C+ 开始+14。

这个说法正确吗?

编辑:我很困惑,因为在 C++ Primer(第 5 版,涵盖 C++11)中,可以阅读“像内置类型一样,默认情况下联合未初始化”(第 848 页) ),但更进一步,有“......联合(成员)将被默认初始化,这意味着联合的第一个成员将被初始化”(第 851 页)。

这对我来说似乎是矛盾的,说默认情况下联合未初始化,然后说作为联合的数据成员的默认初始化将初始化联合的第一个成员。

【问题讨论】:

  • 链接和工会有什么关系?
  • @KerrekSB 我的理解是联合是类(可能是 POD 类型),并且链接解释了在非 POD 类的情况下“默认初始化的影响”(以及隐含的 POD类)。
  • C++ 中的默认初始化包括不初始化 'char'、'int'、...

标签: c++ c++11 initialization c++14


【解决方案1】:

对于任何类类型T,默认初始化T 类型的对象会尝试查找并运行默认构造函数。如果一个联合包含任何具有非平凡构造函数的成员,如果您没有明确定义一个联合的默认构造函数(9.5/2),则该联合的默认构造函数被定义为已删除,因此该程序是非良构的。

【讨论】:

  • 即使union 是 POD 类型,这是否成立?在这种情况下,您是否知道为什么 C++ Primer 5th 会声明“...默认情况下联合未初始化”?
  • @AdN:POD 意味着可简单构造,非(事实上 trivial)?
  • @Barry "Either a ScalarType Or a class type (class or struct or union)",PODType 的处理似乎与您的提取相矛盾。
猜你喜欢
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 2021-06-13
  • 2016-04-26
  • 1970-01-01
相关资源
最近更新 更多