Warum wird ein Wert einer Aufzählung mit einem festgelegten zugrunde liegenden Typ von Zeichen in fct (int) anstelle von fct (char) aufgelöst?
Dieses Problem trat bei der Beantwortung aufDiese Frage zur Überlastungsauflösung mit Aufzählungen.
Während der Fall fürlong long
war definitiv ein Fehler in MSVC2012NovCTP (gemäß dem Standardtext und einem Test mit gcc 4.7.1), ich kann nicht herausfinden, warum das folgende Verhalten auftritt:
#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);
}
Sowohl MSVC2012NovCTP als auch gcc 4.7.1 stimmen in dieser Ausgabe überein:
fct (char)
fct (int)
Sollte nichtA
umgewandelt werden voncharEnum
zuchar
? Warum istA
konvertiert zuint
?
BEARBEITEN: clang beklagt sich, dass der Anruf mehrdeutig ist, was mit meiner Interpretation unten übereinstimmt; Das heißt, ich würde es immer noch viel intuitiver finden, wenn es nur als der zugrunde liegende Typ angesehen würde.
Zwei relevante Standardauszüge sind §7.2 / 9:
Der Wert eines Enumerators oder eines Objekts eines Aufzählungstyps ohne Gültigkeitsbereich wird durch integrale Heraufstufung in eine Ganzzahl umgewandelt (4.5)
Und §4.5 / 4:
Ein Wert eines Aufzählungstyps ohne Gültigkeitsbereich, dessen zugrunde liegender Typ festgelegt ist (7.2), kann in einen Wert seines zugrunde liegenden Typs konvertiert werden. Wenn außerdem eine integrale Heraufstufung auf den zugrunde liegenden Typ angewendet werden kann, kann ein Wert eines Aufzählungstyps ohne Gültigkeitsbereich, dessen zugrunde liegender Typ festgelegt ist, auch in einen Wert des heraufgestuften zugrunde liegenden Typs konvertiert werden.
SocharEnum
kann entweder in konvertiert werdenchar
oder eine integrale Förderung vonchar
, sowieint
.
Aber das ist für mich vage, weil "kann" nicht genau sagt, welche tatsächlich gewählt wird. Wenn überhaupt, sollte dies mit dieser Formulierung nicht eindeutig sein, da kein Vorzug zwischen gegeben wirdchar
oder eine seiner Werbeaktionen. Wenn Sie auskommentierenfct(int)
, dann der Anrufist mehrdeutig. Warum istint
Besondere?
Ich kann mir nur vorstellen, dass integrale Werbeaktionen rekursiv angewendet werden, aber nichts, was ich sehe, erfordert dies.