2013-05-22 13 views
8

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?

+3

Wygląda jak błąd w MSVC, ponieważ g ++ - 4.8 i clang ++ - 3.2 wywołuje funkcję const. – ForEveR

+0

Tak, to błąd, który pojawił się wcześniej. MSVC ignoruje definicje const słowa 'T' w' T() '. –

+1

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) –

Odpowiedz

3

Odpowiednie cytat z normą jest 5.2.3 [expr.type.conv]/2

wyrażenie T(), w którym T oznacza prosty lub typu specyfikator TypeName-specyfikator dla niekompletny typ obiektu kompletnego lub typ (pusty) o kwalifikacjach cv, tworzy prvalue określonego typu, który jest zainicjalizowany wartością (8.5, inicjalizacja nie jest wykonywana dla przypadku void()). [Uwaga: jeśli T jest typem nie należącym do klasy, który ma kwalifikację cv, kwalifikatory cv są ignorowane podczas określania typu wynikowej prvalue (3.10). -end uwaga]

Sformułowanie w standardzie wyraźnie wspomina (w formie non-normatywnego), że dla non-klasie typy const ulotna kwalifikacje spadnie, ale w przypadku, gdy typ jest klasą , a notatka nie ma zastosowania. Wydaje się, że VS stosuje tę samą regułę, która jest stosowana dla typów nieklasowanych.

+0

dzięki za wyjaśnienie – Frahm

Powiązane problemy