Как правильно обойти strict_aliasing при касте похожих типов?
У меня есть 2 структуры, A и B, содержащие по 2 поля. При этом B отличается от A только первым полем, которое является enum class типом, унаследованным от типа первого поля A. Я хочу заполнить массив структур B через указатель на массив A. Является ли такая операция нарушением strict_aliasing, и позволяет ли std::launder устранить ub?
Минимальный воспроизводимый пример того, что я имею ввиду.
#include <iostream>
struct A {
uint32_t field1{0};
uint32_t field2{0};
};
enum class TestE : uint32_t {
};
struct B {
TestE field1{0};
uint32_t field2{0};
};
void test_func(A *aArr, size_t size) {
for (size_t i = 0; i < size; i++) {
aArr[i].field1 = std::rand() % 1024;
aArr[i].field2 = std::rand() % 1024;
}
}
int main() {
B arr[10];
test_func(reinterpret_cast<A *>(arr), 10); // правильно так?
// test_func(std::launder(reinterpret_cast<A *>(arr)), 10); // или так ?
return 0;
}