@Fred Overflow's link to the FAQ to pełna odpowiedź. Ale (przepraszam Marshall) nie jest to najbardziej jednoznaczne wytłumaczenie. Nie wiem, czy moje jest bardziej jasne, ale mam taką nadzieję.
Chodzi o to, czy p
jest char*
wskaźnik, to może być wykorzystane do modyfikować cokolwiek to wskazującego.
A jeśli można uzyskać wskaźnik pp
wskazujący na p
, ale z pp
typu char const**
, następnie można użyć pp
przypisać p
Adres strony const char
.
Dzięki temu można następnie użyć p
, aby zmodyfikować const char
. Lub, możesz pomyśleć, że możesz. Ale ta const char
może być nawet w pamięci tylko do odczytu i hellip;
w postaci kodu:
char const c = 'a';
char* p = 0;
char const** pp = &p; // Not allowed. :-)
*pp = &c; // p now points to c.
*p = 'b'; // Uh oh.
Jako praktyczne rozwiązanie do kodu, który nie kompiluje, & 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!
}
tylko 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. :-)
}
Cheers & HTH.,
[Dlaczego otrzymuję błąd podczas konwersji 'Foo **' → 'Foo const **'? (Http://www.parashift.com/c++-faq-lite/const-correctness.html#faq -18.17) – fredoverflow
Nie ma czegoś takiego jak "niejawna obsada". "Cast" to jawny operator, który określa konwersję. Mogą też występować niejawne konwersje. ("obsada" to operator, "konwersja" to operacja.) –
@Keith: Myślę, że terminologia nie stanowi problemu. W końcu mówimy "up-cast", a nie "up-conversion". Albo przynajmniej tak mówię. :-) –