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 nachar
lub 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.