std::aligned_storageバリアント テンプレートのバッキング ストレージとして使用しています。問題は、-O2gcc で有効にすると、「タイプがパニングされたポインターを逆参照すると厳密なエイリアシングが壊れる」という警告が表示され始めることです。
実際のテンプレートはもっと複雑です (実行時に型がチェックされます) が、警告を生成するための最小限の例は次のとおりです。
struct foo
{
std::aligned_storage<1024> data;
// ... set() uses placement new, stores type information etc ...
template <class T>
T& get()
{
return reinterpret_cast<T&>(data); // warning: breaks strict aliasing rules
}
};
これと本質的に同じことをしていると確信しboost::variantていますが、この問題を回避する方法を見つけることができないようです。
私の質問は次のとおりです。
- このように使用
aligned_storageすると厳密なエイリアスに違反する場合、どのように使用すればよいですか? get()関数に他のポインターベースの操作がない場合 、厳密なエイリアシングの問題は実際にありますか?get()がインライン化されている場合はどうですか?- どう
get() = 4; get() = 3.2ですか?タイプが異なるためにint、そのシーケンスを並べ替えることができますか?float