我在初始化包含 C++11 中成员的联合时遇到了麻烦const
。
在 C++20 中,通过使用指定的初始化器可以避免这个问题。例如:
union my_union
{
const void* ptr;
const double dbl;
};
my_union foo = { .dbl = 42.1 };
然而在 C++11 中这个特性不可用,并且联合似乎总是由它的第一个成员初始化。
由于成员是 const,因此设置成员的唯一方法似乎就是通过初始化。
我考虑使用 placement new 表达式来覆盖联合,但我对与联合相关的生命周期问题感到困惑,特别是如果 placement new “激活”了预期成员(https://godbolt.org/z/z4nMTGGeq)。
#include <iostream>
#include <new>
union my_union
{
const void* ptr;
const double dbl;
};
int main()
{
my_union foo{};
new(&foo) double {42.1};
std::cout << foo.dbl;
}
这个解决方案定义明确吗?或者有更好的解决方案吗?
工会成员的语言版本和const
性质是强加的,不受我的控制。
编辑:联合由无法更改的第三方标题定义。
您可以为不同的成员提供联合构造函数:
输出:
从这个实例中就可以看出。