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, T
T()
sollten so ist rufe die const-Version, oder? oder gibt es einige spezielle regeln, die ich verpasst habe?
Sieht aus wie ein Fehler in MSVC, da g ++ - 4.8 und clang ++ - 3.2 Aufrufe const funktionieren. – ForEveR
Ja, das ist ein Fehler, der schon einmal aufgetreten ist. MSVC ignoriert Const-Qualifikanten von 'T' in' T() '. –
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) –