В книге Страуструпа в главе 5 есть небольшая программа, в которую вы вставляете выборки с целенаправленными ошибками, чтобы лучше понять обработку ошибок.Одна из вставок выглядит следующим образом:
vector<char> v(5); for (int i=0; i<=v.size(); ++i) ; cout << "Success!\n";
Помещенный в код большего размера, он выглядит следующим образом:
#include "std_lib_facilities.h"
int main()
try {
vector<char> v(5);
for (int i=0; i<=v.size(); ++i) ;
cout << "Success!\n";
return 0;
}
catch (exception& e){
cerr<<"error: "<<e.what()<<'\n';
return 1;
}
catch (...){
cerr<<"Oops: unknown exception!\n";
return 2;
}
Я могу исправить код просто отлично.Чтобы исправить это, я удаляю неправильную точку с запятой в середине оператора for, и я якобы заменяю оператор <= на <в операторе for, чтобы это не приводило к ошибке диапазона.Это компилирует и печатает 5 "Удачи!"в терминал.</p>
Проблема в том, что если я изменю программу, чтобы сохранить ошибку диапазона, чтобы увидеть, как будет обрабатываться эта ошибка, я все равно не получу исключение.Если, например, я просто удаляю точку с запятой и оставляю <= как есть, выводится «Удачи!»6 разЕсли я даже заставлю это сделать для i <= v.size () + 10, он все равно выдает «Success!»много раз.</p>
Насколько я понимаю из Страуструпа, это должно быть , а не , как это обрабатывается.Он должен выдать исключение, потому что <= заставляет его читать 6 индексов для вектора v, а шестой индекс должен быть вне диапазона.</p>
Может кто-нибудь помочь мне понять, почему эта программа не выдает исключение для ошибки диапазона и не имеет какие-либо проблемы?
IЯ использую g ++ в качестве моего компилятора на новой установке Ubuntu 18.04, которую я установил с целью обучения программированию.Специальные аргументы компилятора не используются.Просто "g ++ -o NAME CODE.cpp".