次のコードでは、f(unsigned)
の代わりにf(int)
のオーバーロードが選択されています。 clang 3.0とgcc 4.8でテストされています。enum - > intはenum - > unsignedよりも優れた変換をします。
enum E
{
};
E f(int);
int f(unsigned);
E e = f(E(0));
標準の私の読書enum -> int
とenum -> unsigned
の両方が唯一の積分変換を含んで、同一の標準変換シーケンスであることを考えるように私をリードしています。
[conv.integral]列挙型の右辺値は、整数型の右辺値に変換できます。
[over.best.ics]によれば、整数変換のみを含む標準変換シーケンスのランクは「変換」です。
[over.ics.rank]以下のいずれかのルールが適用されない限り、同じ形の二つの暗黙的な変換配列が区別できない変換配列である:[...]言及したルールの
なし思えません2つの標準変換シーケンスを比較するときに適用します。
私には何が欠けていますか?
'enum'はデフォルトで' int'を基本にしていますので、その変換はより良いと思います。 'short'や' char'を使うように言うと、あなたが期待しているあいまいさを得るでしょう。 –
['std :: underlying_type'](http://en.cppreference.com/w/cpp/types/underlying_type)を使用して、列挙型の根底にある型を特定する必要があります。 –
インテグラルプロモーション。それは実際にインテグラルコンバージョンではありません。 [conv.prom] – dyp