質問

C ++標準(整数プロモーション)のセクション4.5では、積分タイプをより高いランクのタイプに変換する特定のケースについて説明しています。

C ++標準(積分変換)のセクション4.7は(弾丸4.7.1)で始まります。

整数タイプのrvalueは、別の整数タイプのrvalueに変換できます。列挙タイプのrvalueは、整数タイプのrvalueに変換できます。

私が理解している限り、4.5で説明されている変換(多分弾丸4.5.3(enums)を除く)は、4.7セクションのみの手法を使用して実行できます:4.5.1および4.5.2は4.7.1で完全にカバーされます。 4.5.4は4.7.4でカバーされています。では、4.5セクション全体の目的は何ですか?どのような追加の変換を有効にしますか?たぶん私はいくつかの制限がありませんか?

PS私は標準のC ++ 03バージョンを読んでいます。

役に立ちましたか?

解決

考える 両方が同じに落ちないので、区別が重要であること 変換カテゴリ そして違う ランク (13.3.3.1.1、標準変換シーケンスを参照)。過負荷解像度に関しては、ランクは違いをもたらします。

標準変換シーケンスはランクによって順序付けられます。正確な一致は、プロモーションよりも優れた変換であり、変換よりも優れた変換です。

最終的に、次のコードを明確にするのは4.5と4.7の区別だと思います。

#include <iostream>

void foo(int i)            { std::cout << "foo(int)" << std::endl; }
void foo(unsigned short i) { std::cout << "foo(unsigned short)" << std::endl; }

int main()
{
    foo(static_cast<short>(1));
}
  • shortint プロモーションです(したがって、プロモーションランクがあります)
  • shortunsigned short 変換です(したがって、変換ランクがあります)

最終的に、このコードは呼び出します foo(int) それはより良い候補者だからです。

他のヒント

プロモーションは、算術およびその他の操作中に発生します。コンバージョンは、1つの積分タイプを別のタイプに単に保存するだけで発生します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top