さまざまな 3D 数学コードベースで、次のようなものに遭遇することがあります。
struct vec {
float x, y, z;
float& operator[](std::size_t i)
{
assert(i < 3);
return (&x)[i];
}
};
これは、実装が同じタイプであってもメンバー間にパディングを誤って追加することが許可されているため、違法です。ただし、実際にはそうするものはありません。
sを介して制約を課すことにより、これを合法にすることはできますstatic_assert
か?
static_assert(sizeof(vec) == sizeof(float) * 3);
static_assert
つまり、トリガーされていないということは、実行時に期待されることを意味しoperator[]
、UB を呼び出さないことを意味しますか?