Меня всё устраивает, я ко всему привык, я это знаю. НО. Не кажется ли вам это слегка нелогичным?
Ну почему, почему одновременно:
1) нельзя менять данные, адресуемые указателем
const char *
2) можно высвободить память, адресуемую указателем
const char *
const char *n=new char[10];
n[0]=0; // НЕЛЬЗЯ
delete[]n;//МОЖНО
Типа снёс к чертям кусок памяти - это ничего страшного, это же не изменение данных. Можно возразить, что оператор delete формально применяется не к данным, а к самому указателю на них. Но ведь
const char * const n=new char[10];
тоже можно удалить.
Выходит
бажного деструктор пофиксит действует ещё одно правило: разрешается высвободить память с любым спецификаторм доступа.
Отличный способ выстрелить себе в ногу, попробовав удалить константную строку.
const char * const n="222";
cout<<n<<endl;
delete[]n;
И хоть приведённая конструкция на GCC не взывала сбоя, в 5.2.2. ("Язык программирования C++" Страуструпа) конструкции типа
сопровождаются отметкой о неопределённости результата.
Кстати, пользуясь случаем, хочу провести мини-тест используемых компиляторов. Сообщите результат выполнения кода
const char *p="111";
const char *q="111";
if(p==q){
cout<<"eq"<<endl;
}
else{
cout<<"!eq"<<endl;
}
и используемый компилятор (на всякий случай и IDE; опционально - флаги компиляции, режим сборки).