variable significado reservada que programa palabra informatica float ejemplos dev con c++ const-correctness

c++ - significado - ¿Por qué aparece un error al convertir un ''float**'' a ''const float**''?



que es double en informatica (4)

Consulte ¿Por qué aparece un error al convertir un Foo ** → const Foo **?

Debido a que la conversión de Foo**const Foo** sería inválida y peligrosa ... La razón por la cual la conversión de Foo**const Foo** es peligrosa es que le permitiría modificar de forma silenciosa y accidental un objeto Foo const sin una conversión

La referencia continúa para dar un ejemplo de cómo una conversión implícita de este tipo podría permitirme modificar un objeto const sin una conversión.

Tengo una función que recibe float** como argumento, y traté de cambiarlo para que tome const float** .

Al compilador ( g++ ) no le gustó y emitió:

invalid conversion from ''float**'' to ''const float**''

esto no tiene sentido para mí, sé (y veré) que puedo pasar char* a una función que toma const char* , ¿por qué no con const float** ?


Esta es una restricción muy difícil. Está relacionado con las reglas de aliasing del lenguaje. Eche un vistazo a lo que dicen los estándares, porque me he enfrentado a esto una vez:

(Página 61)

[Nota: si un programa podría asignar un puntero de tipo T ** a un puntero de tipo const T ** (es decir, si se permitía la línea // 1 a continuación), un programa podría modificar inadvertidamente un objeto const (como está). hecho en la línea // 2). Por ejemplo,

int main() { const char c = ''c''; char* pc; const char** pcc = &pc; //1: not allowed *pcc = &c; *pc = ''C''; //2: modifies a const object }

"Nota final"


Otras respuestas han detallado por qué esto es un error en C ++.

Déjame abordar la pregunta detrás de tu pregunta. Quería declarar, en la interfaz de su función, que su función no modificará los valores flotantes contenidos en la matriz. Buena intención, y permite que su función se llame con arreglos const float ** . La pregunta detrás de tu pregunta sería, cómo lograr esto sin resolverse con los lanzamientos feos.

La forma correcta de lograr lo que quería es cambiar el tipo de parámetro de su función para const float * const * .

La const adicional entre las estrellas asegura al compilador que su método no intentará almacenar los punteros para const flotar en la matriz, ya que este tipo declara que los valores del puntero también son const.

Ahora puede llamar a esta función con los argumentos float ** (que fue el ejemplo en su pregunta), const float ** y const float * const * .


Si convierte el parámetro a const float** , puede almacenar un const float* en la ubicación de la memoria a la que apunta el parámetro. Pero la función de llamada cree que esta ubicación de memoria debe contener un float* no constante float* y, más tarde, podría intentar cambiar este float apuntado a.

Por lo tanto, no puede convertir un float** en un const float** , le permitiría almacenar punteros a constantes en ubicaciones donde se esperan punteros a valores mutables.

Para más detalles, consulte la C ++ FAQ Lite .