可以通过复制前一个活跃成员的值来更改联合中的活跃成员吗std::construct_at
?
这个最小的例子
#include <memory>
constexpr int f() {
union U {
char x{0};
int y;
} u;
std::construct_at(&u.y, u.x);
return u.y;
}
static_assert( f() == 0 );
被 GCC 和 MSVC 接受,但 Clang 拒绝它并出现错误:
/opt/compiler-explorer/clang-19.1.0/bin/../include/c++/v1/__memory/construct_at.h:41:50:
note: read of member 'x' of union with active member 'y' is not allowed in a constant expression
41 | return ::new (std::__voidify(*__location)) _Tp(std::forward<_Args>(__args)...);
在线演示:https://gcc.godbolt.org/z/xrj57jroj
这里哪种实现是正确的?