es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error: No se puede convertir char** a const char**.

Tengo el siguiente código:

static char *ListOfStr[] = {"str1", "str2", "str3"};
void Foo(const char **listOfStr)
{
    // hacer algo
}

Cuando llamo a Foo de la siguiente manera:

Foo(ListOfStr);

Obtengo el error “No se puede convertir char* a const char* (C2664 – vc++)”.

Sé cómo solucionar el problema utilizando casting o de otra manera, como definir un array constante en primer lugar.

Pero, ¿no sería seguro utilizar char* como const char*? ¿Por qué da error?
Supuse que habría una conversión automática al igual que de std::string a const std::string al pasarla a una función. Solo la inversa de esto, de cont char** a char**, debe dar el error sin un cast.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La razón por la que ocurre el error se debe a la coherencia de const. En la función Foo, el parámetro listOfStr se declara como const char**, lo que significa que la función se compromete a no modificar el contenido del array listOfStr. Sin embargo, cuando pasas ListOfStr (que se declara como char*[]) a Foo, intenta convertir un char** a const char**. Esta conversión no está permitida porque permitiría a Foo modificar el contenido de ListOfStr, lo cual violaría la promesa hecha por el prototipo de la función.

    Usar una conversión para convertir char** a const char** técnicamente funcionaría, pero no es una solución segura, ya que permitiría a la función modificar el array supuestamente constante. La forma correcta de resolver este problema es definir ListOfStr como const char*[] en lugar de char*[], ya que esto refleja correctamente la intención del código.

    En general, siempre es mejor utilizar la coherencia de const en tu código, ya que hace que el código sea más robusto y más fácil de razonar. Aunque pueda parecer una molestia en algunos casos, es un buen hábito adquirirlo y te ahorrará posibles errores y fallos más adelante.

Comments are closed.