int a = 0; short b{a}; short c{0};
コンパイラは に対して警告を発しshort b{a}
ます。int
に絞られるので、これは理解できますshort
。
short c{0}
しかし、それは私には奇妙に警告を与えません。リテラル整数について覚えていますが、 の型は0
少なくとも である必要がありますint
。int
からへの絞り込みshort
はここで起こっています。コンパイラが警告を出さないのはなぜですか?
int a = 0; short b{a}; short c{0};
コンパイラは に対して警告を発しshort b{a}
ます。int
に絞られるので、これは理解できますshort
。
short c{0}
しかし、それは私には奇妙に警告を与えません。リテラル整数について覚えていますが、 の型は0
少なくとも である必要がありますint
。int
からへの絞り込みshort
はここで起こっています。コンパイラが警告を出さないのはなぜですか?
の場合short c{0};
、縮小変換は行われません。0
は定数式であり、正確に に格納できるためですshort
。
(私のものを強調)
list-initialization は、以下を禁止することにより、許可される暗黙的な変換を制限します。
...
整数型またはスコープなし列挙型から整数型への変換。元のすべての値を表すことはできません。ただし、ソースが定数式であり、その値をターゲット型に正確に格納できる場合を除きます
標準の$8.6.4/7 List-initialization [dcl.init.list]からの関連する説明と例:
(私のものを強調)
縮小変換は暗黙の変換です
...
整数型またはスコープのない列挙型から、元の型のすべての値を表すことができない整数型へ。
[ 注: 上で示したように、このような変換はリストの初期化のトップレベルでは許可されていません。— 終わりの注記] [例:
// ... const int z = 99; // ... char c4{z}; // OK: no narrowing needed unsigned char uc1 = {5}; // OK: no narrowing needed // ... float f2 { 7 }; // OK: 7 can be exactly represented as a float // ...
— 終了例 ]