Considere o seguinte código:
#include <iostream>
#include <string>
union U
{
std::string s;
U()
{
new(&s) std::string;
}
void Set(std::string new_s)
{
s.~basic_string();
new(&s) std::string(std::move(new_s));
}
~U()
{
s.~basic_string();
}
};
int main()
{
U u;
u.Set("foo");
std::cout << u.s << '\n'; // Do I need `std::launder` here?
}
Eu sei que se eu usasse um array de bytes em vez de uma união, eu teria que std::launder(&s)
acessar a string. Mas eu preciso disso aqui?
A resposta do senso comum parece ser "não", mas então onde está a bênção padrão union
de não precisar std::launder
?