2013-05-26 6 views
8

unsigned short + intの型は実装定義ですか?このコードを考えると

unsigned short us = 0; 
int i = 0; 
auto sum = us + i; 

sum実装定義のタイプですか? C++ 11標準の私の読書は、yesと答えています。

  • 5.7/1は、通常の算術変換が適用されると言います。
  • 4.13/1の箇条書き2と3は、intのランクが、符号なしの短いランクよりも大きいと言います。
  • 5/9 bullet 5 subbullet 4は、intがunsigned shortのすべての値を表すことができる場合、unsigned shortがintに変換され、sumの型がintであることを示します。
  • 5/9 bullet 5 subbullet 5では、intがunsigned shortのすべての値を表すことができない場合、両方のオペランドがunsigned intに変換され、sumの型はunsigned intになります。

上記の分析が正当である場合、それは内蔵型に算術式を使用して初期化変数を宣言するautoを使用して実装定義結果をもたらすことができることを意味します。私はそれが上記のsumのタイプが完全に標準によって決定されていないと多くのプログラマーを驚かせるだろうと思っています。

私の推論は正当なものですか?

+1

あなたのプラットフォームのタイプ特性を調べた後、それは「完全に決定」されています... –

+0

これは標準によって完全には決定されていないことを意味します:-) – KnowItAllWannabe

+2

別の言い方をすれば、算術変換のセクション全体を投げ捨て、実際の結果タイプを示す単純な行列で置き換えることができます。あなたの 'sum'は、' std :: common_type :: type'という型を持っています。 –

答えて

0

タイプは実装固有ですが、実装定義ではありません。実装定義とは、実装が何をしているのかを文書化しなければならないことを意味します。

+0

私はこれを答えとして受け入れていますが、読者は元の質問に対するコメントで追加情報を確認することをお勧めします。 – KnowItAllWannabe

+0

Implementation-Definedの振る舞いに関する標準の仕様は、必要なドキュメントがどのような形で取られなければならないか、どのように具体的なものでなければならないかについてはかなり曖昧です。 'int'と' unsigned short'の範囲を指定する実装(標準で要求されているように)は、これらの型を含む操作がどのように動作しなければならないかを示します。 – supercat

関連する問題