2016-12-11 2 views
7

Warum Beispiel folgende:typeid/type_info seltsame Verhalten

#include <iostream> 
#include <typeinfo> 

template<typename T> 
void fun(const T& param) 
{ 
     std::cout << "T = " << typeid(T).name() << std::endl; 
     std::cout << "param = " << typeid(param).name() << std::endl; 
     std::cout << (typeid(T)==typeid(param)) << std::endl; 
} 

int main(int, char**) 
{ 
     fun(1); 
} 

gibt folgende Ausgabe:

T is i 
param is i 
1 

Ich weiß, dass type_info::name() Verhalten Implementierung abhängt. Wie auch immer, ich würde erwarten, operator==false (weil param ist eine const Referenz und keine ganze Zahl) zurückgeben.

+4

In y unser Code benutzt du '==' aber in deiner Frage '! ='. Klären. –

+4

'typeid' ignoriert Qualifikationsmerkmale der obersten Ebene (einschließlich Referenzen). –

+0

Sorry, behoben – user2449761

Antwort

16

Dies ist so definiert, in dem Standard:

5.2.8/5: Wenn der Typ des Ausdrucks oder typeid ein CV-qualifizierte Typ ist, bezieht sich das Ergebnis der Expression typeid zu einer std :: type_info Objekt des cv-unqualifizierten Typen darstellt [Beispiel:

class D { /* ... */ }; 
D d1; 
const D d2; 
typeid(d1) == typeid(d2); // yields true 
typeid(D) == typeid(const D); // yields true 
typeid(D) == typeid(d2); // yields true 
typeid(D) == typeid(const D&); // yields true 

-End Beispiel]