C++ §中可能存在歧义的语句;9.5/8

C++ §中可能存在歧义的语句;9.5/8,c++,c++11,language-lawyer,C++,C++11,Language Lawyer,C++11标准的§9.5/9(重点): 类联合类是一个联合或具有匿名联合作为直接成员的类。类unionX有一组变量成员如果X是联合,则非匿名联合的X的非静态数据成员是X的变体成员 粗体部分是否表示,在类或联合的类似联合的类之间,只有当它是联合时,才能有非匿名联合的非静态变量成员?如果是这样,为什么?它在代码中有什么实际区别 我实际上在质疑这句话是否意味着“如果X是一个类似于工会的类……”。这对我来说是完全有意义的 不管怎样,这一条款在过去几天里一直困扰着我,我希望完全理解它所说的内容。我感觉到了

C++11标准的§9.5/9(重点):

类联合类是一个联合或具有匿名联合作为直接成员的类。类union
X
有一组变量成员如果
X
联合
,则非匿名联合的
X
的非静态数据成员是
X
的变体成员

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

我实际上在质疑这句话是否意味着“如果
X
是一个类似于工会的类……”。这对我来说是完全有意义的


不管怎样,这一条款在过去几天里一直困扰着我,我希望完全理解它所说的内容。

我感觉到了你的痛苦,查阅标准文档需要多年的认知损伤,才能正确解析这类内容

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

不完全是

这并不是说只有类union的union版本才可以有非静态的废话


它所说的是两者都可以拥有它(从技术上讲,它并没有这样说,但它拒绝反驳这种可能性),但只有联盟版本将其视为“X的变体成员”。不,你试图澄清的是错误的。这是一个类似于X类的并集:

struct X
{
    int a;
    union {
        double b;
        long c;
    };
};
X::a
是类似于类
X
的非匿名联合的非静态数据成员。但它绝对不是一个变种成员

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

似乎(2013-10-13)有一个更精确的定义,引用:

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


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

术语“变体成员”与“变体”的概念相关(例如,Windows中的
variant
)。粗体文本定义了
X
为联合的情况下的变量成员。下面的句子(您没有引用)定义了
X
不是联合的情况下的变量成员,以及作为
X
成员的匿名联合的情况。嗯,这不是当前草案。您的措词实际上比问题中的措词旧(这可能不是它声称的C++11官方措词)。
union U {
    int x = 0;
    union { };
    union {
        int z;
        int y = 1; // error: initialization for second variant member of U
    };
};