2016-05-24 9 views
1

Ich habe folgenden Code geschrieben und für Zeiger zeigt es korrekte Argumenttyp, aber wenn ich Referenz verwenden, zeigt es nur int und keine const. Warum?Warum ist das Argument der Referenzvorlage nicht const?

template <typename T> 
void increment(T& x) 
{ 
    std::cout << "Argument type is : " << typeid(x).name() << std::endl; 
    //x = x + 1; 
} 

template <typename T> 
void increment(T* x) 
{ 
    std::cout << "Argument type is : " << typeid(x).name() << std::endl; 
    //x = x + 1; 
} 

int main() 
{ 
    const int x = 0; 
    const int y = x; 
    increment(x); 
    increment(&y); 
} 

Ausgang:

Argument type is : int 
Argument type is : int const * 

Bitte, können Sie erklären, warum const nicht mit Bezug gezeigt wird?

+0

Weil 'const' ein Qualifier ist, kein Typ? – arrowd

+1

Warum zeigt es dann dieses Qualifikationsmerkmal für Zeigerargumente an? – Kapil

+1

Versuchen Sie Folgendes zu drucken: 'typeid (int const) .name()'. – Nawaz

Antwort

2

Von typeid reference:

Wenn Typ ein Referenztyp ist, bezieht sich das Ergebnis auf ein std::type_info Objekt, das den referenzierten Typen.

und

In allen Fällen cv-Qualifikations von typeid ignoriert werden (das heißt, typeid(T)==typeid(const T))

(genauer Top-Level-const) T war natürlich abgeleitet als const int.


Die Standard Absätze sind [expr.typeid]/4 und [expr.typeid]/5

+0

Also gibt es eine Möglichkeit zu wissen, dass T als const int – Kapil

+0

abgeleitet wird und warum const nicht ignoriert wird im Falle des Zeigertyps – Kapil

+0

@Kapil Weil das ist nicht die oberste Ebene "const". Sie können die 'const'-Eigenschaft mit der Eigenschaft' std :: is_const' überprüfen. – LogicStuff

4
C++ 11 §5.2.8/4

& hellip; Wenn der Typ des Typ-ID ein Verweis auf eine möglicherweise cv, Qualifizierte Typ ist, bezieht sich das Ergebnis der typeid Ausdruck in einen std::type_info Objekt, das die cv -unqualified Typ referenziert wird. & hellip;

C++ 11 §5.2.8/5

Die Top-Level cv -qualifiers des glvalue Expression oder der Typ-ID, die ist der Operand typeid werden immer ignoriert.

Im Wesentlichen wird jede oberste Ebene const gelöscht, genau wie bei den formalen Funktionsargumenttypen wrt. der resultierende Funktionstyp und zusätzlich wird die cv Qualifikation von T in einem Referenztyp T& gelöscht.

Letzteres ist möglicherweise, um nicht zwischen T& und nur T – zu unterscheiden, sie ergeben das gleiche Ergebnis.

+0

Also grundsätzlich in diesem Fall, * Const Droping * ist zwei Schritte Prozess. – Nawaz

+1

@Nawaz: Ich denke, das einfachste konzeptionelle Modell und das, was die Regeln modellieren sollen, ist eine zweistufige Transformation, ja. Entfernen Sie reference-to und entfernen Sie dann die * cv * -Qualität dieses Ergebnisses. Aber formal ist der vorliegende Fall nur ein Schritt, über §5.2.8/4. –