Myślę, że zamieszanie wynika z przekonania, że {"Hey","Hello"}
jest tablicą. To nie jest. To wcale nie jest obiekt. Jest to po prostu specjalna składnia inicjalizacyjna, która może być użyta do zainicjowania tablicy. Nie można go użyć do zainicjowania char**
, ponieważ char**
jest wskaźnikiem, a nie tablicą. Nie tworzy on automatycznie obiektu tablicy, który można przekonwertować na wskaźnik.
Być może myślisz o tym jak o liście [...]
w Pythonie lub obiekcie { ... }
w JavaScript. Wcale tak nie jest. Wyrażenia te faktycznie tworzą obiekty tego typu i mogą być używane w dowolnym miejscu wyrażenia, które może przyjmować te obiekty.Składnia, której używamy w C++, jest składnią inicjującą.
Na przykład mógłby to zrobić:
const char* array[] = {"Hey","Hello"};
const char** p = array;
Ty, jednak nie mogą zrobić coś głupiego takiego:
std::cout << {"Hey", "Hello"}[1];
Tutaj mamy faktycznie utworzony obiekt array, w którym wskaźniki będą przechowywane. Tylko wtedy możemy przekonwertować tę tablicę na const char**
.
Wskaźniki nie są tablicami. –