如何在 C++11 中初始化包含 const 数据成员的联合

问题描述 投票:0回答:1

我在初始化包含 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
性是强加的,不在我的控制范围内。

c++ c++11 language-lawyer union placement-new
1个回答
0
投票

您可以为不同成员提供联合构造函数:

#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

这可以在这个现场示例中看到。

© www.soinside.com 2019 - 2024. All rights reserved.