Будут ли следующие ошибки компиляции?
delete cout;
delete cin;
Ответ: Нет.
Это недостаток в реализации классов потоков из стандартной библиотеки. Они имеют следующую функцию преобразования для void*
, что означает, что все объекты потока могут быть неявно преобразованы в void*
:
operator void * ( ) const;
Это очень полезно в целом, поскольку позволяет нам писать очень идиоматический цикл, скажем, при чтении ввода из файлов. Но в то же время он позволяет пользователю писать delete stream
. Как я уже сказал, вы можете удалить любой объект потока. Таким образом, все это разрешено:
delete ss; //declare std::stringstream ss;
delete iss; //declare std::istringstream iss;
delete oss; //declare std::ostringstream oss;
Только они дадут предупреждение, сказав (см. ideone):
предупреждение: удаление 'void * - undefined
который вы можете легко избегать, просто произнося, скажем, char*
. Но программа все еще проблема, и, скорее всего, произойдет сбой при ее запуске.
-
Итак, мой вопрос в том, была ли эта проблема решена и исправлена, в С++ 11? В следующей статье приведено одно исправление этой проблемы:
-
Edit:
От комментария @Xeo от ответа @Alf:
В документе, в котором предлагается исправление этой проблемы: