使用union的简单结构中的成员变量别名

Phl*_*ous 2 c++ inheritance unions

我有一个简单的观点struct,我想继承:

struct PointXYZ
{
    double x, y, z;
};

class extendedPoint : public PointXYZ
{
public:
    double getXYZ(int i);
    void setXYZ(int i, double value);
private:
    int moreproperties;
};
Run Code Online (Sandbox Code Playgroud)

get-set函数被索引,因为我希望能够循环获取和设置xyz值.我想通过修改,如回答描述了我的基类索引XYZ和独立的X,Y,Z的概念链接这篇文章:

struct PointXYZ
{
    union {
        struct {
            double x, y, z;
        };
        double xyz[3];
    };
};

class extendedPoint : public PointXYZ
{
public:
    double getXYZ(int i) { return xyz[i]; }
    void setXYZ(int i, double value) { xyz[i] = value; }
private:
    int moreproperties;
};
Run Code Online (Sandbox Code Playgroud)

这篇文章直接与第一篇文章相矛盾:以下内容是否有效:

double dostuff()
{
    PointXYZ p;
    p.x = 123.88;
    return p.xyz[0];
}
Run Code Online (Sandbox Code Playgroud)

那么,是否PointXYZ使用了union有效的c ++并且编译器之间是否一致?

Bar*_*rop 6

从标准:

在并集中,至多一个非静态数据成员可以在任何时间处于活动状态,也就是说,任何时候最多一个非静态数据成员的值都可以存储在并集中.[注意:为了简化联合的使用,我们做了一个特别的保证:如果标准布局联合包含几个共享公共初始序列(9.2)的标准布局结构,并且这个标准布局联合类型的对象包含一个标准布局结构,允许检查任何标准布局结构成员的公共初始序列; 见9.2. - 结束说明]

在我看来,特殊保证表明了这一点

struct PointXYZ {
    union {
        struct {
            double xyz[3];
        };
        struct {
            double x, y, z;
        };
    };
};
Run Code Online (Sandbox Code Playgroud)

阅读不是最后写的成员时应该工作得很好(看到它发生).

但请注意,根据规格,你的例子

struct PointXYZ {
    union {
        struct {
            double xyz[3];
        };
        double x, y, z;
    };
};
Run Code Online (Sandbox Code Playgroud)

读取未写入的成员时是未定义的行为(看到它发生).设置xyz[0],xyz[1]xyz[2],全部x,y并且z具有与xyz[0]链接示例中相同的值.我希望大多数编译器都表现得像这样,但标准并不保证.