[英]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())
那样安全地做表达式(并使用它的结果)吗?
是,如果TaggedUnion
是StandardLayoutType 。 标准布局类型的一个属性是可以将指向 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.