Изменилось ли в прошлом поведение удаления указателей на константы? - PullRequest
7 голосов
/ 28 января 2011

Я получил следующий тестовый код от http://support.microsoft.com/kb/131322:

const int * pi   = new int(1000);
const char * pch = new char(65);

void main(void)
   {
   delete  pi  ;// Error C2710:cannot delete a pointer to a const object
   delete  pch ;// Error C2710:cannot delete a pointer to a const object
   }

На этой странице Microsoft утверждает, что удаление указателя на const недопустимо, что мне кажется логичным.Вы не хотите, чтобы функции, которые вы указали в виде const для удаления экземпляра за вашей спиной.

Довольно странно, вопрос Удаление указателя на const (T const *) указываетчто это разрешено, и это даже имеет смысл.

И действительно, если я компилирую код со страницы MSDN с Visual Studio 2010, он компилируется правильно (даже без предупреждений при компиляции с /W4).

Изменилось ли поведение в отношении удаления указателей на константы в прошлом в стандарте C ++?Или это было изменено в Visual Studio?

Ответы [ 3 ]

12 голосов
/ 28 января 2011

Вы действительно можете delete указатель на const.

Если Visual C ++ говорит иначе для программы, соответствующей стандарту, то это ошибка компилятора и должна быть

Ваша (или Microsoft?) программа не является стандартным C ++, поскольку у вас есть void тип результата для main.

В статье базы знаний, на которую вы ссылаетесь, говорится "Удаление"указатель на константу не должен быть разрешен по определению (ARM раздел 5.3.4) ", и, хотя это неверно, ссылка, которую он дает, верна.В разделе 5.3.4 ARM говорится, что «указатель на константу не может быть удален».Тем не менее, ARM был опубликован в 1990 году ...

C ++ был стандартизирован примерно десять лет спустя, в 1998 году, и в стандарте C ++ вы можете удалить указатель на const.Это не указано в нормативном тексте;это указано, опуская ограничение.Однако стандарт C ++ 98 §5.3.5 / 2 содержит следующее ненормативное примечание :

указатель на constтип может быть операндом delete-expression ;нет необходимости отбрасывать константу (5.2.11) выражения указателя, прежде чем он будет использован в качестве операнда delete-expression .

Теперь мы закончиличерез десять лет после этой стандартизации, через 20 лет после ARM.

Какую версию Visual C ++ вы используете?

Cheers & hth.,

2 голосов
/ 28 января 2011

Вам разрешено удалить указатель на const, и Microsoft явно ошибалась ранее.Насколько я знаю, стандарт никогда не менялся.

Нет сомнений, что кто-то с копией процитирует главу и стих (и получит большую репутацию).int, а не void.

1 голос
/ 28 января 2011

Также обратите внимание, что сама ссылка Microsoft говорит:

ПРИМЕЧАНИЕ. Компилятор Visual C ++ .NET не демонстрирует эту проблему в соответствии с изменениями, внесенными в C ++ ANSIСтандарты.

Интересно!

...