Как правильно обойти 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;
    }

Ответы (0 шт):