@Fred Overflow link to the FAQ es una respuesta completa. Pero (lo siento Marshall) no es la explicación más clara. No sé si el mío es más claro, pero espero que sí.
La cosa es, si p
es un puntero char*
, entonces se puede utilizar para modificar como quiera que se apunta a.
Y si se pudiera obtener un puntero que apunta a pp
p
, pero con pp
de tipo char const**
, entonces se podría utilizar para asignar a pp
p
la dirección de un const char
.
Y con eso, podría usar p
para modificar el const char
. O, pensarías que podrías. Pero ese const char
podría estar incluso en la memoria de solo lectura & hellip;
En código:
char const c = 'a';
char* p = 0;
char const** pp = &p; // Not allowed. :-)
*pp = &c; // p now points to c.
*p = 'b'; // Uh oh.
como una solución práctica a su código que no se compila, y hellip;
#include <iostream>
void print(const char** thing) {
std::cout << thing[0] << std::endl;
}
int main(int argc, char** argv) {
print(argv); // Dang, doesn't compile!
}
just do & hellip;
#include <iostream>
void print(char const* const* thing)
{
std::cout << thing[0] << std::endl;
}
int main(int argc, char** argv)
{
print(argv); // OK. :-)
}
Saludos & HTH.,
[¿Por qué me aparece un error al convertir un 'Foo **' → 'Foo const **'?] (Http://www.parashift.com/c++faq-lite/const-correctness.html#faq -18.17) – fredoverflow
No existe el "molde implícito". Un 'molde' es un operador explícito que especifica una conversión. También puede haber conversiones implícitas. ("cast" es el operador, "conversión" es la operación). –
@Keith: Creo que la terminología no es un problema. Después de todo, decimos "up-cast" y no "up-conversion". O, al menos, digo eso. :-) –