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 respostasEm 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_assert
s?
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?