Przykładowy kod pochodzi z: http://en.cppreference.com/w/cpp/types/add_cv (I zmodyfikowano trochę.)Jak to się stało, że const temporary zdecyduje się wywołać funkcję nie-const z elementem const?
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
}
a wyjście jest:
Non-cv
Non-cv
w drugim naborze, T
jest const kwalifikacje, więc T()
powinien zadzwoń do wersji const, prawda? czy są jakieś specjalne zasady, które przeoczyłem?
Wygląda jak błąd w MSVC, ponieważ g ++ - 4.8 i clang ++ - 3.2 wywołuje funkcję const. – ForEveR
Tak, to błąd, który pojawił się wcześniej. MSVC ignoruje definicje const słowa 'T' w' T() '. –
Sformułowanie językowe wymaga, aby wewnątrz szablonu, gdy "T" jest typem ** nie-klasy ** z możliwymi stałymi kwalifikacjami, kwalifikacja jest odrzucana podczas generowania wartości * prvalue *. Wydaje się, że VS używa tej samej logiki również dla typów klas (niepoprawnie) –