【发布时间】:2021-12-26 16:52:15
【问题描述】:
给定代码:
struct A { int i; };
struct B { std::string s; };
struct C
{
union
{
A a{};
B b;
};
};
以下访问是否定义良好:
void foo()
{
C c; // c.a is active
c.b = {}; // now c.b is active
auto& b = reinterpret_cast<B&>(c.a); // read c.b via access to c.a
// use b somehow
}
【问题讨论】:
-
您问题中的具体代码可能是合法的,因为class.union.1 中的公共初始序列保证。您可能想在这些结构中添加一些东西...
-
@dratenik 如果我正确阅读了该段落,它允许通过
c.b.x访问c.a.x(假设它们的布局兼容)。所以它谈论的是工会成员,但我问的是工会成员本身。 -
我会说第一个工会成员充当任何其他工会成员。我会说 reinterpret_cast 非活动工会成员是迂腐病态或 UB。
-
@Jarod42 并不意味着通过命名联合进行强制转换也将是 UB,例如
auto& b = reinterpret_cast<B&>(c.myUnion)。我们在这里访问非活动成员吗?由于类和它们的第一个成员(此处忽略类型限制)之间的指针定义明确,我认为通过第一个成员访问它也可以。 Example -
ub 还是不等什么?那里什么也抓不到
标签: c++ language-lawyer c++20