Изменение активного члена в союзе с копированием с помощью std::construct_atC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Изменение активного члена в союзе с копированием с помощью std::construct_at

Сообщение Anonymous »

Можно ли изменить активный член в объединении, скопировав значение предыдущего активного члена, используя std::construct_at?
Этот минимальный пример

Код: Выделить всё

#include 

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)...);
Онлайн-демо: https://gcc.godbolt.org/z/xrj57jroj
Какая реализация здесь правильная?

Подробнее здесь: https://stackoverflow.com/questions/791 ... nstruct-at
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»