§9.5/ 9来自C ++ 11标准(强调我的):
类似于联盟的类是一个联合或类,它具有匿名联合作为直接成员。类似联合的类
X
具有一组变体成员。 如果X
是union
,则X
的非静态数据成员不是匿名联盟,是X
的变体成员。
部分以粗体显示在类似联合的类之间是一个类还是一个联合,只有当它是一个联合时才能有一个不是匿名联合的非静态变体成员?如果是这样,为什么?它在代码中有什么实际区别?
我实际上质疑这句话是否意味着“如果X
是类似于联盟的类 ......”。那时对我来说很有意义。
无论哪种方式,这个条款在过去的几天一直困扰着我,我希望完全理解它的含义。
答案 0 :(得分:5)
不,你的澄清是错误的。这是一个类似联盟的类X:
struct X
{
int a;
union {
double b;
long c;
};
};
X::a
是类似联合的类X
的非静态数据成员,它不是匿名联合。但它绝对不是变种成员。
联合的所有非静态数据成员都是变体成员。对于不是联合的类似联合的类,只有那些嵌套在union子对象中的类才是变体成员。
答案 1 :(得分:2)
我感觉到你的痛苦,通过查看标准文档需要多年的认知损害才能正确地解析那些东西。
只有它是一个联合,它是否有一个不是匿名联合的非静态变体成员?
不完全。
这并不是说只是类似联盟的类的联合版本可以有非静态的等等等等。
所说的是两者都可以拥有它(从技术上来说,它不是说但是它拒绝反驳这种可能性),但只有联合版本会对它进行处理作为“X的变体成员”。
答案 2 :(得分:0)
似乎latest publicly avalable draft(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
};
};
至于问题,粗体部分实际上定义什么是变体成员,类似于联盟的类必须具有(通过具有{{1}作为直接成员)成为类似于联盟的类。