この式は、標準 (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 番目の箇条書きの現在の読み方が間違っているという事実を受け入れるならば、彼は正しい方向に進んでいたと思います。