Код: Выделить всё
#include
#include
#include
#include
template
concept trivially_copyable = std::is_trivially_copyable_v;
namespace details {
// required to pass a plain array to and from bit_cast
template
struct wrap_array {
T arr[N];
};
} // namespace details
template
constexpr void set_byte(T& obj, std::size_t pos, std::byte val) {
details::wrap_array obj_rep;
// static only with c++>=23
// static details::wrap_array obj_rep;
obj_rep = std::bit_cast(obj);
if (pos >= sizeof(T)) {
return;
}
obj_rep.arr[pos] = val;
obj = std::bit_cast(obj_rep);
}
Мне интересно, определен ли этот фрагмент для структур с заполнением, таких как предложенный в этом вопросе (вопрос будет таким же для структуры с битовыми полями):
Код: Выделить всё
#include
struct S40 {
std::uint8_t a = 0x51;
std::uint32_t b = 0xa353c0f1;
};
Согласно последней версии std::bit_cast:
Если u имеет тип беззнакового обычного символа или тип std::byte, u имеет неопределенное значение, если какой-либо из битов в его представлении значения неопределенен или иным образом имеет ошибочное значение.
/>
Таким образом, первый std::bit_cast выше создает некоторые std::bytes с неопределенными значениями.
Подпадает ли он под исключения в Basic.indet, оставляя программу в определенном состоянии и позволяя читать это значение, даже если оно неопределенное?
Сделаем еще один шаг, если я изменю байт, содержащий неопределенное значение (теперь давая ему определенный) и выполните второй std::bit_cast, https://eel.is/c++draft/bit.cast#4 дает, что бит заполнения возвращаемой структуры «не указан», но я не могу найти определение этой концепции в этом контексте (возможно, неуказанное поведение, которое говорило бы, что программа правильно сформирована, но точный результат зависит от фактической реализации).
Действительна ли полученная структура в то время как представление значения соответствует допустимому для типа? Без неопределенного поведения?
Моя цель — убедиться, что функция действительна, когда я хочу изменить только байты, участвующие в представлении значения (но они могут содержать неопределенные биты, в случае битового поля). Если я попытаюсь изменить байты/биты заполнения, я ожидаю, что значение объекта останется неизменным и программа будет работать нормально.
Подробнее здесь: https://stackoverflow.com/questions/798 ... dding-bits
Мобильная версия