2013-05-22 3 views
8

Das Codebeispiel ist entnommen aus: http://en.cppreference.com/w/cpp/types/add_cv (ich ein wenig modifiziert.)Wie kommt es, dass ein Const temporär wählt, eine nicht-konstante Member-Funktion über eine Konstante zu benennen?

struct foo 
{ 
    void m() { std::cout << "Non-cv\n"; } 
    void m() const { std::cout << "Const\n"; } 
}; 

template<class T> 
void call_m() 
{ 
    T().m(); 
} 

int main() 
{ 
    call_m<foo>(); 
    call_m<const foo>(); //here 
} 

Und der Ausgang ist:

Non-cv 
Non-cv 

im zweiten Aufruf, const qualifiziert, TT() sollten so ist rufe die const-Version, oder? oder gibt es einige spezielle regeln, die ich verpasst habe?

+3

Sieht aus wie ein Fehler in MSVC, da g ++ - 4.8 und clang ++ - 3.2 Aufrufe const funktionieren. – ForEveR

+0

Ja, das ist ein Fehler, der schon einmal aufgetreten ist. MSVC ignoriert Const-Qualifikanten von 'T' in' T() '. –

+1

Die Sprachformulierung erfordert, dass innerhalb der Vorlage, wenn "T" ein ** Nicht-Klassen ** -Typ mit möglicher Konst-volatile-Qualifikation ist, die Qualifikation beim Generieren des * prvalue * gelöscht wird. Es scheint, dass VS die gleiche Logik auch für Klassenarten verwendet (falsch) –

Antwort

3

Das entsprechende Zitat aus dem Standard 5.2.3 [expr.type.conv]/2

Der Ausdruck T(), wobei T ein einfacher Typ-Spezifizierer oder Type-Name-Spezifizierer für a ist Nicht-Array-vollständiger Objekttyp oder der (möglicherweise cv-qualifizierte) Void-Typ erstellt einen Pr-Wert des angegebenen Typs, der value- initialisiert wird (8.5; für den Fall void() wird keine Initialisierung durchgeführt). [Anmerkung: Wenn T ein Nicht-Klassen-Typ ist, der cv-qualifiziert ist, werden die cv-Qualifikationsmerkmale ignoriert, wenn der Typ des resultierenden prvalue (3.10) bestimmt wird. -Ende note]

Die Formulierung in der Norm erwähnt ausdrücklich (in nicht-normativer Form), dass für nicht-Klasse Typen der const flüchtige Qualifikation fielen gelassen wird, aber in Ihrem Fall ist die Art eine Klasse, und der Hinweis gilt nicht. Es scheint, dass VS die gleiche Regel anwendet, die für Nicht-Klassen-Typen angewendet wird.

+0

danke für die Erklärung – Frahm

Verwandte Themen