9

C++11 では、縮小変換の概念が形式化され、リストの初期化で最上位レベルで縮小変換を使用することは許可されていません。

Tとの 2 つの型が与えられた場合、 からへUの変換が縮小されているかどうかを実装定義にすることができるかどうか疑問に思っています。標準の私の読書によれば、これは事実です。これが私の推論です:TU

  • dcl.init.list (8.5.4) パラグラフ 7 によると、変換が縮小される可能性がある 1 つの方法は、「整数型または範囲指定されていない列挙型から、元のすべての値を表すことができない整数型への暗黙的な変換」である場合です。タイプ"。
  • unsigned intからへの暗黙的な変換を考えてみましょうlong
  • との相対的なサイズに関してはintlongC++ で必要なのは だけですsizeof(int) <= sizeof(long)
  • 実装 A を考えてみましょうsizeof(int) == sizeof(long)。この実装では、longのすべての値を表すことができないunsigned intため、変換は縮小されます。
  • 実装 B を考えてみましょうsizeof(int) < sizeof(long)。この実装では、longのすべての値を表すことができるunsigned intため、変換は縮小されません。

私の分析では、変換が縮小しているかどうかは実装で定義できるというのは正しいですか? これは望ましいことですか?

4

1 に答える 1

5

私は確かに、型自体で「縮小変換」を定義することを好みます。int i{long(non_constant_expression)}コンパイルが許可されない方法で。単純な理由は次のとおりです。長い範囲が必要ない場合intは、最初に使用する必要があるか、「カット」が本当に必要です。これは、明示的な型変換またはキャスト。最初の質問に答えるには: これは実装定義です。

size_tしかし、正直なところ、私はこの未加工の型、int32_t、などを使用することはほとんどありませんuint16_t。これにより、問題が自動的に解決されます。(uint16_t {uint8_t()}は常に狭くなりますが、uint16_t{uint16_t()}決して狭まることはありません。) 思慮深くsize_t別のものに変換する必要がありますが、それは常に当てはまります。

于 2012-11-19T11:49:26.940 に答える