§9.5/8 中可能含糊不清的陈述

Potentially ambiguous statement in §9.5/8

本文关键字:含糊不清 陈述      更新时间:2023-10-16

§9.5/9 来自 C++11 标准(强调我的(:

类似工会的阶级

是一个工会或以匿名工会作为直接成员的阶级。类似联合的类X具有一组变体成员如果Xunion,则X的非静态数据成员不是匿名联合,是X的变体成员。

粗体部分是不是说,在一个类或工会的类之间,只有当它是一个联合时,它才能有一个不是匿名联合的非静态变体成员?如果是这样,为什么?它在代码中有什么实际区别?

我实际上是在质疑这句话是否意味着"如果X是一个类似工会的阶级......"。那对我来说是完全有意义的。

无论哪种方式,这个条款在过去几天里一直困扰着我,我希望完全理解它所说的内容。

不,您尝试的澄清是错误的。 这是一个类似工会的 X 类:

struct X
{
    int a;
    union {
        double b;
        long c;
    };
};

X::a 是非匿名联合的类X的非静态数据成员。 但它绝对不是变体成员。

联合的所有非静态数据成员都是变体成员。 对于不是联合的类联合类,只有那些嵌套在联合子对象中的类才是变体成员。

我能感受到你的痛苦,查看标准文档需要多年的认知损害,才能正确解析这类东西。

只有当它是一个联合时,它才能有一个不是匿名联合的非静态变体成员?

差一点。

这并不是说只有类似工会的阶级的工会版本才能拥有非静态的等等等等。

所说的是两者都可以拥有它(从技术上讲,它不是这么说,但它拒绝反驳这种可能性(,但只有联合版本才会将其视为"X 的变体成员"。

似乎最新的公开可用草案(2013-10-13(有一个更精细的定义,引用:

类似工会的类

是一个工会或具有匿名工会的类 作为直接成员。类似联合的 X 类有一组变体 成员。如果X是联合,则X的非静态数据成员是 不是匿名工会是X的变体成员。此外,一个 作为 X 成员的匿名联合的非静态数据成员 也是X的变体成员。工会中最多一个变体成员 可能具有大括号或等于初始值设定项。例:

union U {
    int x = 0;
    union { };
    union {
        int z;
        int y = 1; // error: initialization for second variant member of U
    };
};

至于这个问题,粗体部分实际上是定义了什么是变体成员一个类似工会的类必须拥有(通过有一个union作为直接成员(才能成为一个类似工会的类