Dlaczego wartość enum ze stałym typem char rozstrzyga fct (int) zamiast fct (char)?

Ten problem pojawił się podczas odpowiadaniato pytanie o rozdzielczość przeciążenia z enumami.

Podczas gdy sprawalong long był zdecydowanie błędem w MSVC2012NovCTP (zgodnie ze standardowym tekstem i testem z gcc 4.7.1), nie mogę zrozumieć, dlaczego występuje następujące zachowanie:

#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);
}

Zarówno MSVC2012NovCTP, jak i gcc 4.7.1 zgadzają się co do tego wyjścia:

fct (char)
fct (int)

Nie powinienemA być konwertowane zcharEnum dochar? Dlaczego jestA być zamienionym naint?

EDIT: clang skarży się, że wywołanie jest niejednoznaczne, co zgadza się z moją interpretacją poniżej; że powiedziałbym, że nadal byłby bardziej intuicyjny, gdyby był uważany za typ bazowy.

Dwa istotne standardowe fragmenty to § 7.2 / 9:

Wartość modułu wyliczającego lub obiektu typu nieskalowanego wyliczenia jest konwertowana na liczbę całkowitą przez integralną promocję (4.5)

I §4,5 / 4:

Wartość nieskalowanego typu wyliczeniowego, którego typ bazowy jest ustalony (7.2), może zostać przekonwertowana na wartość jego podstawowego typu. Ponadto, jeśli integralna promocja może być zastosowana do jej typu bazowego, prvalue nieskalowanego typu wyliczenia, którego typ bazowy jest ustalony, można również przekonwertować na prvalue promowanego typu bazowego.

WięccharEnum może zostać zamieniony nacharlub jakiejkolwiek integralnej promocjichar, Jak na przykładint.

Ale jest to dla mnie niejasne, ponieważ „może” nie mówi całkiem, co zostanie wybrane. Jeśli tak, to powinno być niejednoznaczne z tym sformułowaniem, ponieważ między preferencjami nie ma żadnych preferencjichar lub dowolne z jego promocji. Jeśli komentujeszfct(int), a następnie połączeniejest dwuznaczny. Dlaczego jestint specjalny?

Jedyne, co mogę myśleć, to że integralne promocje są stosowane rekurencyjnie, ale nic, co widzę, nie wymaga tego.

questionAnswers(2)

yourAnswerToTheQuestion