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

时间:2014-09-11 02:25:19

标签: c++ c++11 language-lawyer

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

  

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

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

我实际上质疑这句话是否意味着“如果X类似于联盟的类 ......”。那时对我来说很有意义。

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

3 个答案:

答案 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}作为直接成员)成为类似于联盟的类