繁体   English   中英

通过 void 指针访问匿名联合成员

[英]Anonymous union member access via void pointer

让我们考虑这样的标记联合:

struct TaggedUnion
{
    union
    {
        int integer;
        float real;
        std::string text;
        ...
    };
    size_t disc;
    void* data()
    {
        return &integer;
    }
    //other special member functions for memory management of non-pod union members
};

如果我知道std::string是匿名联合的活跃成员,我可以像*reinterpret_cast<std::string*>(taggedUnionInstance.data())那样安全地做表达式(并使用它的结果)吗?

是,如果TaggedUnionStandardLayoutType 标准布局类型的一个属性是可以将指向 object 的指针reinterpret_cast为指向其第一个非静态数据成员的指针(下面的标准引用)。 根据 (9.5/5),由于匿名联合只是一个未命名的TaggedUnion ,它也是 TaggedUnion 的数据成员

形式...的联合称为匿名联合 它定义了未命名类型的未命名 object

这是第一个非静态数据成员。 现在,标准布局类型的一个要求是它们的所有数据成员也是标准布局,也就是说这个联合是标准布局。 现在,根据标准(9.2/19、20 或 21,具体取决于版本):

如果标准布局 class object 具有任何非静态数据成员,则其地址与其第一个非静态数据成员的地址相同。

另外: (9.5/1)

联合 object 的所有非静态数据成员具有相同的地址

然后第一个非静态数据成员与所有其他数据成员具有相同的地址,包括std::string text的地址。

或者,如果对 (9.5/5) 的解释不同,即匿名联合的成员是父 class 的成员(我不确定),这仍然有效,因为标准仍然需要成员的地址匿名联合具有相同的地址,因此std::string text仍将具有与第一个元素相同的地址, int integer

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM