以下のプログラムは厳密なエイリアシング規則に違反していますか?厳密なエイリアス違反
#include <cstdint>
int main()
{
double d = 0.1;
//std::int64_t n = *reinterpret_cast<std::int64_t*>(&d); // aliasing violation
//auto n{*reinterpret_cast<std::int64_t*>(&d)}; // aliasing violation
auto nptr{reinterpret_cast<std::int64_t*>(&d)};
auto& n{*nptr};
++n;
}
VS2015、clang又はgccによって放出された無警戒。
Re "厳密な[エイリアシング]の違反はUBです"、まったくありません。厳密なエイリアシングは、その最適化に関連するgccの概念です。代わりに、C++標準では、再解釈の結果を移植可能な方法でどのように使用できるかどうかについてのルールがあります。この例では、正式なUBを引き起こします。しかし、この例は、特定のプラットフォームでうまくいく可能性があります。 –
@ Cheersandhth.-Alf: "* C++標準には、再解釈の結果をポータブルな方法でどのように使用できるかについてのルールがあります。この用語はGCCオプションから来るかもしれませんが、ルール自体はありません。だから私はあなたのポイントが何かを見ていない。いいえ、この例では、どのプラットフォームでも明確に定義された動作が許可されていません。 3.10/10では、 'int64_1'へのポインタを通して' double'の値に*常に*アクセスすることはできません。 –
CおよびC++ *が特定のプラットフォームでの型打ちを行うことができないという見解は、現実に反しています。その応答は、私が指摘しようとしてきたことの非常に良い例です。残念なことに、この見解は、g ++(そしてプラグインの置き換えとしてのclang)をそれほど実用的でないものにしています。 –