当前位置: 首页 > 知识库问答 >
问题:

在C++中用`{}`聚合初始化联合

贡可人
2023-03-14
#include <iostream>

struct A { int x = 1; };
struct B { int x = 0; };

union U {
    A a;
    B b;
};

int main() {
    U u{};
    std::cout << u.a.x;
}

共有1个答案

华善
2023-03-14

按照[dcl.init.aggr]/1:

聚合是数组或类([class]),具有

  • (1.1)没有用户声明或继承的构造函数([class.ctor]),
  • (1.2)没有私有或受保护的直接非静态数据成员([class.access]),
  • (1.3)没有虚函数([class.virtual]),并且
  • (1.4)没有虚拟、私有或受保护的基类([class.mi])。
    null
    null

因此

U u{};

是聚合初始化,其结果是union类的第一个数据成员,即a类型的数据成员a(非union聚合类)从空的初始化器列表中复制初始化。由于a类型的单个数据成员X有一个默认的成员初始值设定项,因此根据上面[dcl.init.aggr]/5.1,数据成员X由其默认的成员初始值设定项初始化。

因此,Clang是正确的,GCC是错误的。

    null
 类似资料:
  • 我试图理解@bolov对删除默认构造函数问题的第一个公认答案。对象仍然可以创建......有时[1] 似乎我发现了一个错误,所以它搞乱了整个解释。 @bolov解释了为什么这段代码能够在c 11中成功编译: 场景A 以及为什么这段代码无法在c 11中编译: 场景C 他说,重点是第一个foo是聚合,第二个foo不是聚合。 然后他给出了cppreference的摘录: T类型对象的列表初始化的影响是:

  • 问题内容: 从sys.c第123行: 是数组的通用指针,我可以看到。但是,表示法是什么: 什么是? 编辑: 我在这里学到了另一个C技巧:将被 预处理 并替换为其内容并分配给。 问题答案: 使用 指定的初始化 程序进行 初始化 。 基于范围的初始化是gnu gcc扩展。 要将一系列元素初始化为相同的值,请写入。这是一个GNU扩展。例如, 它不是便携式的。编译与告诉您。 它在这里如何运作? 预处理器在

  • 是GCC和Clang中的bug,还是标准允许他们接受此代码?

  • 我开始研究 OOAD,我很难找到一个 代码示例来说明如何以编程方式实现、和。(到处都有几篇文章,但它们与 C# 或 Java 有关)。我确实找到了一两个例子,但它们都与我的导师的指示相冲突,我很困惑。 我的理解是,在: < li >关联:Foo有一个指向Bar对象的指针作为数据成员 < li >聚合:Foo有一个指向Bar对象的指针,Bar的数据被深度复制到该指针中。 < li >组成:Foo有一

  • 我试图确认我对关联、聚合的代码外观的理解 聚合:哈斯-a。它具有另一种类型的现有对象 组成:由另一个对象组成 协会:我对此有两种看法。 > 当一个类与另一个类相关联时。因此,上述两个都是关联的示例。 关联是一种较弱的聚合形式,其中类不保留对其接收的对象的引用。 我的理解正确吗?我在这里和这里阅读了相互矛盾的文章,所以我真的不确定该遵循哪一个。我的理解似乎符合第一个环节。我觉得第二个环节是错误的,或

  • 我有一个比较长的联合选择: 我想把xxx定义为一个用户定义的变量,这样我就不用重复这个条件很多次了。不幸的是,我的MySQL客户机(可视化)不支持多个语句,所以我不能在一开始就使用SET。有没有一种方法可以在不改变SQL输出的情况下将用户定义的变量包含到这样的语句中?