Программирование: принципы и практика с использованием C ++ 2-е издание, Глава 5 Drill - Программа не выдает исключение, когда ожидается - PullRequest
0 голосов
/ 18 октября 2018

В книге Страуструпа в главе 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".

...