6

mit G ++ 3.4 und 4.7 I das folgende seltsamen Verhalten beobachtet:C++ Überlastungs Auflösung, benutzerdefinierte Umwandlung und Funktionsschablone

eine Funktionsschablone nicht übereinstimmt, wenn ein Benutzer definierte Umwandlung notwendig ist, wo eine Ebene funktioniert. Ich konnte die entsprechende Regel im C++ 98 Standard nicht finden. Ist g ++ korrekt, (wie ich annehme)? Oder ist es ein Fehler?

template <class T> 
int x(auto_ptr_ref<T> p) 
{ 
    return 1; 
} 
// this would match 
/* 
int x(auto_ptr_ref<int> p) 
{ 
    return 2; 
} 
*/ 
void dummy() 
{ 
    cout << x(auto_ptr<int>()) << endl; 
} 

Antwort

7

GCC ist korrekt, template argument deduction berücksichtigt implizite Konvertierungen nicht.

Die Typableitung berücksichtigt keine impliziten Konvertierungen (außer den oben aufgeführten Typanpassungen): das ist der Job für die Überladungsauflösung, was später passiert.

für Ihren Code, auto_ptr_ref entspricht nicht gegen auto_ptr, den Abzug der Template-Parameter T ausfällt, so dass die Funktionsvorlage x() nicht für die Überladungsauflösung überhaupt in Betracht gezogen werden.