我在初始化包含 C++11 中的
const
成员的联合时遇到问题。
在 C++20 中,通过使用指定的初始值设定项可以避免该问题。示例:
union my_union
{
const void* ptr;
const double dbl;
};
my_union foo = { .dbl = 42.1 };
但是,在 C++11 中,此功能不可用,并且似乎联合总是由其第一个成员初始化。
由于成员是 const,似乎设置成员的唯一方法是通过初始化。
我考虑使用放置新表达式来覆盖联合体,但我对与联合体相关的生命周期问题感到困惑,特别是如果放置新“激活”预期成员(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
性是强加的,不在我的控制范围内。
您可以为不同成员提供联合构造函数:
#include <iostream>
union my_union
{
my_union(void* ptr_) : ptr(ptr_) {}
my_union(double dbl_) : dbl(dbl_) {}
const void* ptr;
const double dbl;
};
int main()
{
my_union foo{42.1};
std::cout << foo.dbl;
}
输出:
42.1
这可以在这个现场示例中看到。