Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Return res;






}

 

Если функция, объявленная с ключевым словом noexcept все-таки сгенерирует исключение (т.е. исключение попытается покинуть функцию с noexcept), то программа закрывается (путем вызова функции terminate()). При вызове terminate() мы не можем рассчитывать на согласованное состояние объектов (т.е. нет гарантии того, что деструкторы вызваны, нет гарантии раскрутки стека, и нельзя возобновить выполнение программы, как будто ничего не произошло). Это намеренное поведение, которое делает noexcept простым, грубым и очень эффективным механизмом (значительно более эффективным по сравнению со старым механизмом throw()).

Спецификатор noexcept может быть условным. Например, некоторый алгоритм может не генерировать исключений, если (и только если) операции шаблонных параметров, используемых в этой функции также не генерируют исключения:

// do_f генерирует исключение, если f(v.at(0) может генерировать исключения

template< class T>

void do_f(vector< T> & v) noexcept(noexcept(f(v.at(0))));

{

for(int i; i< v.size(); ++i)

v.at(i) = f(v.at(i));

}

 

Здесь первое ключевое слово noexcept используется в качестве оператора: выражение noexcept(f(v.at(0))) равняется true, если f(v.at(0)) не генерирует исключений, т.е. если методы f() и at() объявлены с noexcept.

Оператор noexcept() является константным выражением и не вычисляет свои операнды.

Общая форма определения noexcept выглядит так: noexcept(expression) и «просто noexcept» является лишь сокращенной формой для noexcept(true). Каждое объявление функции должно содержать совместимую (compatible) спецификацию noexcept.

Деструкторы не должны генерировать исключения; сгенерированный деструктор неявно объявляется как noexcept (не зависимо от его тела), если деструкторы всех членов класса объявлены как noexcept.

Обычно операторы перемещения (move operators) не должны генерироватьисключений, поэтомустарайтесь объявлять их как noexcept. Сгенерированные компилятором операторы копирования и перемещения неявно объявлены как noexcept, если все члены, для которых используются операторы копирования и перемещения, содержат noexcept деструкторы.

В стандартной библиотеке noexcept широко и систематично используется для улучшения производительности и уточнения требований.

См. также:

  • Standard: 15.4 Exception specifications [except.spec].
  • Standard: 5.3.7 noexcept operator [expr.unary.noexcept].
  • [N3103==10-0093] D. Kohlbrenner, D. Svoboda, and A. Wesie: Security impact of noexcept. (Noexcept must terminate, as it does).
  • [N3167==10-0157] David Svoboda: Delete operators default to noexcept.
  • [N3204==10-0194] Jens Maurer: Deducing " noexcept" for destructors
  • [N3050==10-0040] D. Abrahams, R. Sharoni, and D. Gregor: Allowing Move Constructors to Throw (Rev. 1).

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.