Infatti, "hello"
è di tipo char const[6]
.
Ma il succo della domanda è ancora corretto: perché il C++ ci consente di assegnare una posizione di memoria di sola lettura a un tipo non const
?
L'unico motivo è la compatibilità con le versioni precedenti con il vecchio codice C, che non conosceva const
. Se C++ fosse stato rigoroso qui avrebbe rotto un sacco di codice esistente.
Detto questo, la maggior parte dei compilatori può essere configurata su con avviso su tale codice come deprecato, o addirittura farlo in modo predefinito. Inoltre, C++ 11 non consente questo, ma i compilatori potrebbero non applicarlo ancora.
For Fans Standerdese:
[Ref 1]C++ 03 standard: §4.2/2
Una stringa letterale (2.13.4) che non è una grande stringa letterale può essere convertita in un valore di rvalore di tipo "puntatore al carattere"; un letterale di stringa ampio può essere convertito in un valore di rvalore di tipo "puntatore a wchar_t". In entrambi i casi, il risultato è un puntatore al primo elemento dell'array. Questa conversione viene considerata solo quando esiste un tipo di target puntatore esplicito appropriato e non quando esiste una necessità generale di conversione da un valore lvalue a un valore rvalue. [Nota: questa conversione è obsoleta. Vedi Allegato D.] Ai fini del ranking nella risoluzione di sovraccarico (13.3.3.1.1), questa conversione è considerata una conversione da matrice a puntatore seguita da una conversione di qualifica (4.4). [Esempio: "abc" viene convertito in "puntatore a const char" come conversione da matrice a puntatore e quindi a "puntatore a char" come conversione di qualifica. ]
C++ 11 rimuove semplicemente la citazione sopra che implica che è un codice illegale in C++ 11.
[Ref 2]C99 normali 6.4.5/5 "letterali di stringa - Semantics":
In fase di traduzione 7, un byte o codice di valore zero è allegato a ciascun carattere multibyte sequenza risultante da una stringa letterale o letterale. La sequenza di caratteri multibyte viene quindi utilizzata per inizializzare un array di durata e durata di memorizzazione statica sufficiente per contenere la sequenza.Per i letterali stringa di caratteri, gli elementi dell'array hanno carattere char e sono inizializzati con i singoli byte della sequenza di caratteri multibyte; per i letterali a stringa ampia, gli elementi dell'array hanno tipo wchar_t e sono inizializzati con la sequenza di caratteri ampi ...
Non è specificato se questi array siano distinti purché i loro elementi abbiano i valori appropriati. Se il programma tenta di modificare tale array, il comportamento non è definito.
fonte
2012-04-22 14:19:20
Questo è consentito solo per la compatibilità con C. Generalmente in C++ è considerato deprecato e i buoni compilatori danno un avvertimento. – iammilind