Почему значение перечисления с фиксированным базовым типом char разрешается в fct (int) вместо fct (char)?
Эта проблема возникла при ответеэтот вопрос о разрешении перегрузки с перечислениями.
Пока дело за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 согласны с этим выводом:
ПКТ (символ)
ГЦТ (целое)
не должныA
быть преобразованным изcharEnum
вchar
? ПочемуA
превращается вint
?
РЕДАКТИРОВАТЬ: Clang жалуется, что вызов является неоднозначным, что согласуется с моим толкованием ниже; Тем не менее, я все равно нашел бы это гораздо более интуитивно понятным, если бы он считался только базовым типом.
Два соответствующих стандартных выдержки - §7.2 / 9:
Значение перечислителя или объекта типа перечисления с незаданной областью преобразуется в целое число путем интегрального преобразования (4.5).
И §4.5 / 4:
Значение типа перечисления с незаданной областью, базовый тип которого фиксирован (7.2), может быть преобразовано в значение базового типа. Более того, если интегральное продвижение может быть применено к его базовому типу, prvalue типа перечисления с незаданной областью, базовый тип которого фиксирован, также может быть преобразовано в prvalue повышенного базового типа.
ТакcharEnum
может быть преобразован вchar
или любое интегральное продвижениеchar
, такие какint
.
Но для меня это расплывчато, потому что «может» не совсем говорит, какой из них будет выбран. Во всяком случае, это должно быть двусмысленным с этой формулировкой, потому что междуchar
или любое из его акций. Если вы закомментируетеfct(int)
тогда звонокявляется неоднозначный. Почемуint
особый?
Единственное, о чем я могу думать, это то, что интегральные продвижения применяются рекурсивно, но ничего, что я вижу, не требует этого.