誰かが次のようなものに巻き込まれたとしても、私はそれほど驚かないでしょう。
float ra[] = {0, CHAR_MAX, SHORT_MAX, INT_MAX, LONG_MAX};
(私の実装では、最後の2つは、int / longに変換して戻したときに同じ結果を生成しないため、狭くなっています)
でも、これを書いたことは覚えていません。限界への近似が何かに役立つ場合にのみ役立ちます。
これも少なくとも漠然ともっともらしいようです:
void some_function(int val1, int val2) {
float asfloat[] = {val1, val2}; // not in C++0x
double asdouble[] = {val1, val2}; // not in C++0x
int asint[] = {val1, val2}; // OK
// now do something with the arrays
}
しかし、それは完全に説得力があるわけではありません。なぜなら、私が正確に2つの値を持っていることがわかっているのなら、なぜそれらを単にではなく配列に入れるのfloat floatval1 = val1, floatval1 = val2;でしょうか。しかし、なぜそれをコンパイルする必要があるのか(そして、精度の低下がプログラムの許容可能な精度の範囲内である場合は機能する)、そうではないのか、動機は何float asfloat[] = {val1, val2};ですか?いずれにせよ、2つのintから2つのfloatを初期化していますが、1つのケースでは、2つのfloatがたまたま集合体のメンバーであるということです。
これは、(特定の実装では)ソースタイプのすべての値がデスティネーションタイプで表現可能であり、元の値に変換可能であるにもかかわらず、非定数式が結果として変換を狭める場合には特に厳しいように思われます。
char i = something();
static_assert(CHAR_BIT == 8);
double ra[] = {i}; // how is this worse than using a constant value?
バグがないと仮定すると、おそらく修正は常に変換を明示的にすることです。マクロで奇妙なことをしているのでない限り、配列初期化子は配列の型の近く、または少なくとも型を表すものの近くにしか表示されないと思います。これはテンプレートパラメーターに依存する可能性があります。したがって、冗長であれば、キャストは簡単なはずです。