W rzeczywistości "hello"
jest typu char const[6]
.
Ale sedno pytania jest nadal słuszne - dlaczego C++ pozwala nam przypisać lokalizację pamięci tylko do odczytu do typu innego niż const
?
Jedynym powodem tego jest kompatybilność wsteczna ze starym kodem C, która nie znała const
. Jeśli C++ byłby tutaj ścisły, zepsułoby to wiele istniejącego kodu.
To powiedziawszy, większość kompilatorów może być skonfigurowana do ostrzec o takim kodzie jako przestarzałe, a nawet zrobić to domyślnie. Co więcej, C++ 11 nie dopuszcza tego całkowicie, ale kompilatory mogą go jeszcze nie wymuszać.
Na Standerdese Wentylatory:
[Nr 1]C++ 03 standard: §4.2/2
Łańcuch znaków (2.13.4), która jest szeroka literał łańcuchowy można przekonwertować na wartość r type "wskaźnik do char"; szeroki ciąg literału można przekształcić na wartość typu "wskaźnik do wchar_t". W obu przypadkach wynikiem jest wskaźnik do pierwszego elementu tablicy. Ta konwersja jest rozważana tylko wtedy, gdy istnieje wyraźny odpowiedni docelowy typ wskaźnika, a nie wtedy, gdy istnieje ogólna potrzeba konwersji z lwartości do wartości r. [Uwaga: ta konwersja jest przestarzała.. Patrz załącznik D.] W celu uszeregowania w rozdzielczości przeciążenia (13.3.3.1.1), konwersja ta jest uważana za konwersję między tablicami a po konwersji kwalifikacji (4.4). [Przykład: "abc" jest konwertowane na "wskaźnik na stały znak" jako konwersja tablica do wskaźnika, a następnie na "wskaźnik do znaku" jako konwersja kwalifikacji. ]
C++ 11 po prostu usuwa powyższy cytat, co oznacza, że jest to nielegalny kod w C++ 11.
[Nr 2]C99 Standard 6.4.5/5 "string literale - semantyka":
w fazie translacji 7 bajt lub kod wartości zerowej jest dołączony do każdego znaku wielobajtowym sekwencja, która wynika z literału lub literałów ciągu. Wielobajtowa sekwencja znaków jest następnie wykorzystywana do zainicjowania tablicy czasu i długości statycznego przechowywania wystarczającej do zachowania sekwencji.W przypadku literałów łańcuchowych znaków elementy tablicy mają typ char i są inicjowane pojedynczymi bajtami wielobajtowej sekwencji znaków; w przypadku literałów o szerokich ciągach elementy tablicy mają typ wchar_t i są inicjowane sekwencją szerokich znaków ...
Nie jest określone, czy te tablice są odrębne, pod warunkiem, że ich elementy mają odpowiednie wartości. Jeśli program próbuje zmodyfikować taką tablicę, zachowanie jest niezdefiniowane.
Jest to dozwolone tylko w przypadku zgodności z C. Zwykle w C++ jest uważany za przestarzały, a dobre kompilatory ostrzegają. – iammilind