1. ホーム
  2. c++

[解決済み] C++0xでの変換の狭小化。これって、まるで破壊的な変更のように聞こえるのは私だけでしょうか?

2023-03-30 22:38:33

質問

C++0xでは、以下のコードや類似のコードが不正な形式となる予定です。 狭義変換 doubleint .

int a[] = { 1.0 };

このような初期化は実際のコードであまり使われていないのではないかと思っています。この変更によってどれだけのコードが壊されるのでしょうか?もしあなたのコードが影響を受けるのであれば、あなたのコードでこれを修正するのは大変な作業でしょうか?


参考までに、n3225 の 8.5.4/6 を参照してください。

絞り込み変換は暗黙の変換

  • 浮動小数点数型から整数型への変換、または
  • ただし、ソースが定数式で、変換後の実際の値が(正確に表現できない場合でも)表現可能な値の範囲内である場合、または、long double から double または float、あるいは double から float への変換。
  • ただし、ソースが定数式で、変換後の実際の値がターゲットの型に収まり、元の型に変換されたときに元の値を生成する場合は例外です。
  • ただし、ソースが定数式で、変換後の実際の値がターゲットの型に適合し、元の型に変換されたときに元の値を生成する場合は例外とする。

どのように解決するのですか?

GCC を使用したときに、このようなブレークダウンに遭遇しました。 このようなコードに対してコンパイラーはエラーを出力しました。

void foo(const unsigned long long &i)
{
    unsigned int a[2] = {i & 0xFFFFFFFF, i >> 32};
}

機能的には void foo(const long long unsigned int&) :

エラー:狭義変換の (((long long unsigned int)i) & 4294967295ull) から long long unsigned int から unsigned int の中にある{ }。

エラー:狭義変換の (((long long unsigned int)i) >> 32) から long long unsigned int から unsigned int の中にある{ }。

幸いなことに、エラーメッセージはわかりやすく、修正も簡単でした。

void foo(const unsigned long long &i)
{
    unsigned int a[2] = {static_cast<unsigned int>(i & 0xFFFFFFFF),
            static_cast<unsigned int>(i >> 32)};
}

このコードは外部ライブラリにあり、1つのファイルに2つだけ出現していました。 私は、このブレークチェンジが多くのコードに影響を与えるとは思いません。 初心者は を取得する を混乱させるかもしれません。 とはいえ