6

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

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

整数型の右辺値は、別の整数型の右辺値に変換できます。列挙型の右辺値は、整数型の右辺値に変換できます。

私が理解している限り、4.5で説明されている変換(おそらく箇条書き4.5.3(列挙型)を除く)は、4.7セクションの手法のみを使用して実行できます。4.5.1と4.5.2は4.7.1で完全にカバーされています。4.5.4は4.7.4でカバーされています。では、4.5セクション全体の目的は何ですか?どのような追加の変換が可能になりますか?多分私はいくつかの制限を逃していますか?

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

4

2 に答える 2

9

どちらも同じ変換カテゴリに分類されず、ランクも異なるため、区別が重要だと思います(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));
}
  • shorttointはプロモーションです(したがって、プロモーションランクがあります)
  • shorttounsigned shortは変換です(したがって、変換ランクがあります)

結局、このコードはfoo(int)より良い候補であるために呼び出されます。

于 2011-01-09T17:45:36.993 に答える
5

昇格は、算術演算およびその他の操作中に発生します。変換は、ある整数型を別の整数型に格納するだけの場合に発生します。

于 2011-01-09T17:31:14.870 に答える