8

この式は、標準 (N3797) の §8.5.4/7 の例に記載されています。

unsigned int ui1 = {-1}; // error: narrows

§8.5.4/7 とその 4 番目の箇条書きを考えると:

縮小変換は暗黙の変換です。

  • 整数型またはスコープのない列挙型から、元の型のすべての値を表すことができない整数型へ。ただし、ソースが整数昇格後の値がターゲット型に適合する定数式である場合を除きます。

-1 は定数式であり、整数昇格後の値は unsigned int に収まるため、ここでは狭小化はないと思います。

Integral Promotionについては、§4.5/1 も参照してください。

bool、char16_t、char32_t、または wchar_t 以外の整数型の prvalue で、整数変換ランク (4.13) が int のランクよりも小さいものは、int がソース型のすべての値を表すことができる場合、int 型の prvalue に変換できます。 ; それ以外の場合は、ソースの prvalue を unsigned int 型の prvalue に変換できます。

4.13 から、-1 (int) のランクは unsigned int のランクに等しいため、unsigned int に変換できます。

編集

残念ながら、 Jerry Coffinはこのスレッドから回答を削除しました。この標準の変更後、§8.5.4/7 の 4 番目の箇条書きの現在の読み方が間違っているという事実を受け入れるならば、彼は正しい方向に進んでいたと思います。

4

3 に答える 3

1

標準の文言の変更は、負の値を unsigned 型に変換することは常に縮小変換であるという理解を確認することを目的としています。

非公式には、-1 は unsigned 型の範囲内で表すことはできず、それを表すビット パターンは、unsigned int に格納されている場合、同じ値を表していません。したがって、これは縮小変換であり、昇格/拡大は含まれません。

これは、標準を読むという巧妙な芸術についてです。いつものように、コンパイラが最もよく知っています。

于 2014-01-21T14:03:42.903 に答える