Reinterpretar struct com membros do mesmo tipo que uma matriz de uma maneira compatível com o padrão [duplicado]

Esta pergunta já tem uma resposta aqui:

Converter matriz dupla em uma estrutura de duplas 6 respostas

Em várias bases de código de matemática 3d, às vezes encontro algo assim:

struct vec {
    float x, y, z;

    float& operator[](std::size_t i)
    {
        assert(i < 3);
        return (&x)[i];
    }
};

O que, o AFAIK é ilegal porque as implementações têm permissão para adicionar espúrios entre os membros, mesmo que sejam do mesmo tipo, embora nenhum o faça na prática.

Isso pode ser legalizado pela imposição de restrições através destatic_asserts?

static_assert(sizeof(vec) == sizeof(float) * 3);

I.e. fazstatic_assert não ser acionado implicaoperator[] faz o que é esperado e não chama o UB em tempo de execução?

questionAnswers(5)

yourAnswerToTheQuestion