char *s = "foo";
хитрый пони. Он не говорит вам, что это действительно строка только для чтения, хотя в действительности это так. Это так, потому что вы можете попросить своего коллегу написать еще одну строку, например:
char *t = "foo";
Теперь компилятор, в лучшем случае, сохранит только одну копию, а ее изменение будет означать лот работы только для того, чтобы вы и ваш друг были счастливы. Так что он не пытается это сделать. Это то, что вы должны найти в стандарте. Угадай, что, что ты делаешь, вызывает UB.
Тем не менее, если бы у вас был свой путь, это сломало бы много унаследованного кода, который бедные парни из Комитета по стандартам не могли себе позволить. Итак, вы здесь.
Помните, что const
мы виновны в том, что неосторожное использование родилось не за один день. Бьярне много занимался самоанализом, как и многие другие, ставить или нет. На самом деле, у него была прекрасная идея иметь переменные только для чтения и только для записи ... но я сохраню эту историю на следующий день.
И, наконец, наш хороший друг С, о котором мы должны позаботиться. Итак ...