これはGoogleを介して簡単に解決できる質問だと思っていましたが、決定的な(または推測的な)答えを見つけることができないようです。
コンパレータステートメントを使用する場合、暗黙的なキャストはどの順序で発生しますか?
int i = -1;
size_t t = 1;
bool result = i < t;
これは次と同等ですか?
bool result = i < int(t); // equals true
また:
bool result = size_t(i) < t; // equals false
これは質問の簡単な部分です。2番目の部分は「一般的なルールは何ですか」です。
- 'simpler'引数は、常に'more complex'引数(つまり、size_t-> int)に変換されます。
- 最初の(または2番目の)引数は常に2番目の(または最初の)引数の型に変換されます。
- size_tやintなどの組み込みプリミティブには、ケースバイケースでキャストを指定する特定のコンパレータ演算子があります。
3つすべてが妥当なように見えますが、2つ目は、ほとんどの人が直感的に期待するものとは大幅に異なる動作をもたらします。
VC ++コンパイラは、intをsize_tと比較すると、レベル3の警告の価値があると考えているようですが、size_tを返す関数から負の数を返す場合にのみレベル4の警告が表示されます(結果として、返される最大整数の半分以上)。
レベル4の警告をすべて取り除くために、とにかくすべてを明示的にキャストしましたが、「真実」を知りたかったのです。これはどこかで定義する必要があります...