Обратная совместимость.
Вы не можете изменить символ const. Это очевидно.
Что не очевидно, так это то, что тип строкового литерала на самом деле является указателем на постоянные символы, а не на указатель на символы. Следовательно, вторая декларация имеет неправильный тип. Однако это поддерживается по историческим причинам.
Обратите внимание, что приведенное выше является ложью. Вместо указателей строковые литералы на самом деле являются типами char[]
.
В частности, тип строкового литерала - это char[]
, а не const char[]
в C89 и C99 [и я думаю, C11, но не уверен, хотя]. Это не на самом деле неправильно, но данные хранятся в сегменте только для чтения, поэтому это неопределенное поведение, чтобы попытаться записать на него.
Кроме того, для чего это стоит, вы можете использовать -Wwrite-strings
с GCC (г ++ уже включает его), чтобы быть предупреждены об этом.
Больше информации here и here.
* «Думаю, в обоих случаях компилятор должен дать ошибку времени компиляции». * - Это должно, но как это могло быть? Вы назначаете значение неконстантному объекту, что является совершенно законной операцией. Как компилятор знает, что 't' указывает на объект const? –