Estou tendo problemas para inicializar uma união que contém const
membros em C++11.
Em C++20 o problema é evitado usando inicializadores designados. Exemplo:
union my_union
{
const void* ptr;
const double dbl;
};
my_union foo = { .dbl = 42.1 };
Entretanto, no C++11 esse recurso não está disponível e parece que a união é sempre inicializada pelo seu primeiro membro.
Como os membros são constantes, também parece que a única maneira de definir um membro é por meio da inicialização.
Pensei em usar uma nova expressão de posicionamento para substituir a união, mas estou confuso com os problemas de tempo de vida relacionados às uniões, especialmente se o posicionamento novo "ativa" o membro pretendido ( 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;
}
Esta solução está bem definida? Ou existem soluções melhores?
A versão da linguagem e const
a identidade dos membros do sindicato são impostas e estão fora do meu controle.
Editar: A união é definida por um cabeçalho de terceiros que não pode ser alterado.