Dieses:
typedef int& ref;
const ref error;
nicht tut, was Sie denken, es tut. Betrachten Sie stattdessen:
typedef int* pointer;
typedef const pointer const_pointer;
Die Art der const_pointer
ist int* const
, nichtconst int *
. Das heißt, wenn Sie sagen const T
Sie sagen "machen Sie einen Typ, wo T unveränderlich ist"; Im vorherigen Beispiel wird also der Zeiger (nicht der Zeiger) unveränderlich gemacht.
Es können keine Referenzen erstellt werden const
oder volatile
. Dies ist:
ist bedeutungslos, so hat das Hinzufügen von CV-Qualifier zu Referenzen keine Wirkung.
Daher hat error
den Typ int&
. Sie können ihm keine const int&
zuweisen.
Es gibt andere Probleme in Ihrem Code. Zum Beispiel ist dies sicherlich falsch:
template<class t>
t const& check()
{
return t(); //return a temporary object
}
Was bist du hier einen Verweis auf ein temporäres Objekt zurückkehrt , die ihre Lebensdauer endet, wenn die Funktion zurückgibt. Das heißt, Sie erhalten ein undefiniertes Verhalten, wenn Sie es verwenden, da sich kein Objekt im Referant befindet. Dies ist nicht besser als:
template<class t>
t const& check()
{
T x = T();
return x; // return a local...bang you're dead
}
Ein besserer Test wäre:
template<class T>
T check()
{
return T();
}
Der Rückgabewert der Funktion vorübergehend ist, so dass Sie immer noch können testen, dass man in der Tat binden Provisorien zu konstanten Referenzen .
Gute Antwort. +1 :) –
Vielen Dank. :) – GManNickG