conversión implícita función Detener
-
25-09-2019 - |
Pregunta
Me encontré con una situación extraña hoy en día en el que necesitaba una función para no convertir implícitamente valores.
Después de algunos mirando en Google me encontré con este http://www.devx.com/cplus/10MinuteSolution/37078 / 1954
Sin embargo, pensé que era un poco estúpido utilizar una sobrecarga de la función de cualquier otro tipo que quiero bloquear así que en vez que hice esto.
void function(int& ints_only_please){}
int main()
{
char a=0;
int b=0;
function(a);
function(b);
}
Me mostró el código a un amigo y él sugirió añadí const int antes de lo que la variable no es editable, sin embargo, cuando me empezó a recopilar bien, pero no debe, mirada abajo para ver lo que quiero decir
void function(const int& ints_only_please){}
int main()
{
char a=0;
int b=0;
function(a); //Compiler should stop here but it doesn't with const int
function(b);
}
¿Alguien sabe qué es esto?
Solución
El uso de plantillas para obtener el efecto deseado:
template <class T>
void foo(const T& t);
template <>
void foo<int>(const int& t)
{
}
int main(){
foo(9); // will compile
foo(9.0); // will not compile
return 0;
}
Tenga en cuenta que sólo escribimos una versión especial de la plantilla para int
de manera que una llamada que tiene cualquier otro tipo como un parámetro de plantilla dará lugar a un error de compilación.
Otros consejos
Es legal para vincular una referencia temporal a un const
, pero no una referencia no const
.
A char
se puede convertir implícitamente a un int
y el temporal que es el resultado de esta conversión puede ser unido a un parámetro de la función const int&
se extiende la vida útil del temporal hasta que las salidas de función.