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 werdencharoder 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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage