Este:
typedef int& ref;
const ref error;
no hace lo que usted cree. Considere su lugar:
typedef int* pointer;
typedef const pointer const_pointer;
El tipo de const_pointer
es int* const
, noconst int *
. Es decir, cuando dices const T
estás diciendo "crea un tipo donde T es inmutable"; entonces en el ejemplo anterior, el puntero (no el punto) se hace inmutable.
Las referencias no pueden hacerse const
o volatile
. Este:
int& const x;
no tiene sentido, por lo que añadir CV-calificadores a las referencias no tiene ningún efecto.
Por lo tanto, error
tiene el tipo int&
. No puede asignarle un const int&
.
Hay otros problemas en su código. Por ejemplo, esto es ciertamente equivocada:
template<class t>
t const& check()
{
return t(); //return a temporary object
}
Lo que está haciendo aquí está volviendo una referencia a un objeto temporal que termina su vida útil cuando la función devuelve. Es decir, obtienes un comportamiento indefinido si lo usas porque no hay ningún objeto a la vista. Este no es mejor que:
template<class t>
t const& check()
{
T x = T();
return x; // return a local...bang you're dead
}
Una prueba mejor sería:
template<class T>
T check()
{
return T();
}
El valor de retorno de la función es una temporal, por lo que aún puede probar que pueda temporales de hecho se unen a las referencias constantes .
Buena respuesta. +1 :) –
Gracias. :) – GManNickG