この問題は、 enums を使用したオーバーロードの解決に関するこの質問に答えるときに発生しました。
long long
原因は間違いなく MSVC2012NovCTP のバグでしたが (標準テキストと gcc 4.7.1 でのテストによると)、次の動作が発生する理由がわかりません。
#include <iostream>
enum charEnum : char { A = 'A' };
void fct(char) { std::cout << "fct(char)" << std::endl; }
void fct(int) { std::cout << "fct(int)" << std::endl; }
void fct(long long) { std::cout << "fct(long long)" << std::endl; }
int main()
{
fct('A');
fct(A);
}
MSVC2012NovCTP と gcc 4.7.1 の両方がこの出力に同意します。
fct(文字)
fct(int)
からにA
変換すべきではありませんか? に変換されるのはなぜですか?charEnum
char
A
int
編集: clang は、呼び出しがあいまいであると不平を言います。これは、以下の私の解釈に同意します。とはいえ、それが基礎となる型であるとのみ考えられていれば、私はそれをはるかに直感的に見つけることができます.
関連する 2 つの標準の抜粋は §7.2/9 です。
列挙子の値またはスコープのない列挙型のオブジェクトは、整数昇格によって整数に変換されます (4.5)
そして§4.5/4:
基になる型が固定されている (7.2) スコープのない列挙型の prvalue は、その基になる型の prvalue に変換できます。さらに、基になる型に整数昇格を適用できる場合、基になる型が固定されている範囲指定されていない列挙型の prvalue も、昇格された基になる型の prvalue に変換できます。
したがってcharEnum
、 に変換するか、などchar
の の任意の整数昇格を行うことができます。char
int
しかし、これは私には漠然としています。なぜなら、「できる」は実際にどちらが選択されるかを正確に示していないからです。どちらかといえば、この表現はあいまいである必要がありますchar
。をコメントアウトするfct(int)
と、呼び出しがあいまいになります。なぜint
特別なのですか?
私が考えることができる唯一のことは、統合プロモーションが再帰的に適用されるということですが、それを強制するものは何もありません。