questo:
typedef int& ref;
const ref error;
non fa quello che pensi lo fa. Considerate invece:
typedef int* pointer;
typedef const pointer const_pointer;
Il tipo di const_pointer
è int* const
, nonconst int *
. Cioè, quando dici const T
stai dicendo "fai un tipo in cui T è immutabile"; così nell'esempio precedente, il puntatore (non il pointee) è reso immutabile.
I riferimenti non possono essere effettuati const
o volatile
. Questo:
int& const x;
non ha significato, quindi l'aggiunta di qualifiche cv ai riferimenti non ha alcun effetto.
Pertanto, error
ha il tipo int&
. Non è possibile assegnare un const int&
ad esso.
Ci sono altri problemi nel codice. Ad esempio, questo è certamente sbagliato:
template<class t>
t const& check()
{
return t(); //return a temporary object
}
Che cosa stai facendo qui sta tornando un riferimento a un oggetto temporaneo che termina la sua vita quando la funzione restituisce. Cioè, si ottiene un comportamento indefinito se lo si utilizza perché non vi è alcun oggetto al referente. Questo non è meglio di:
template<class t>
t const& check()
{
T x = T();
return x; // return a local...bang you're dead
}
Una prova migliore sarebbe:
template<class T>
T check()
{
return T();
}
Il valore di ritorno della funzione è una temporanea, in modo da poter ancora provare che si può provvisori infatti si legano ai riferimenti costanti .
Buona risposta. +1 :) –
Grazie. :) – GManNickG