Спецификатор noexcept
Помечайте функции, не выбрасывающие исключения
«Спецификатор noexcept» — бесплатный урок C++ Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Что объявляет noexcept
Спецификатор noexcept обещает, что функция не будет возбуждать исключения. Если это всё же произойдёт, программа вызовет std::terminate.
#include <iostream>
int square(int x) noexcept {
return x * x;
}
int main() {
std::cout << square(5) << "\n";
}Почему это важно
Знание о том, что функция не может возбудить исключение, позволяет компилятору и библиотеке выполнять оптимизацию — например, выбирать перемещение вместо копирования при увеличении контейнера.
Операции перемещения должны быть noexcept
std::vector использует Ваш конструктор перемещения при перераспределении памяти только в том случае, если он объявлен как noexcept; иначе для безопасности выполняется копирование. Поэтому помечайте операции перемещения как noexcept.
struct Buffer {
int* p;
Buffer(Buffer&& o) noexcept : p(o.p) { o.p = nullptr; }
};Деструкторы по умолчанию имеют noexcept
Начиная с C++11 деструкторы неявно объявляются как noexcept. Если позволить исключению выйти из деструктора, программа завершится.
Условный noexcept
noexcept(expr) делает обещание зависимым от логического значения, известного во время компиляции, — это полезно в шаблонах, которые передают гарантии другого типа.
template <class T>
void swapValues(T& a, T& b) noexcept(noexcept(T(std::move(a)))) {
T tmp = std::move(a);
a = std::move(b);
b = std::move(tmp);
}Проверка с помощью оператора noexcept
Оператор noexcept(expr) возвращает true, если для выражения объявлено отсутствие исключений, — это удобно в шаблонах.
#include <iostream>
int f() noexcept { return 1; }
int g() { return 2; }
int main() {
std::cout << noexcept(f()) << " " << noexcept(g()) << "\n"; // 1 0
}noexcept является частью типа
Начиная с C++17 noexcept является частью типа указателя на функцию, поэтому функция, способная возбуждать исключения, не может быть присвоена указателю с noexcept.
Не давайте чрезмерных обещаний
Помечайте функцию как noexcept только в том случае, если уверены, что она не может возбудить исключение. Нарушенное ложное обещание приведёт к аварийному завершению всей программы.
Подходящие кандидаты
Операции обмена, перемещения, деструкторы, простые методы получения и арифметические вспомогательные функции естественным образом подходят для объявления как noexcept.
noexcept и устаревшая спецификация исключений
Старая динамическая спецификация throw() устарела и была удалена. В современном C++ вместо неё используйте noexcept.
Производительность и безопасность
noexcept документирует намерение и включает такие оптимизации, как перемещение при перераспределении памяти, — небольшая аннотация с ощутимым эффектом.
Быстрая проверка
Проверьте, насколько хорошо Вы понимаете noexcept.
Итоги
Вы узнали, что спецификатор noexcept обещает отсутствие исключений и позволяет выполнять такие оптимизации, как перемещение при перераспределении памяти. Помечайте операции перемещения, обмена и деструкторы как noexcept, используйте условные формы в шаблонах и никогда не давайте чрезмерных обещаний.
Часто задаваемые вопросы
Урок «Спецификатор noexcept» бесплатный?
Да — полный текст урока «Спецификатор noexcept» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Спецификатор noexcept»?
Помечайте функции, не выбрасывающие исключения Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Спецификатор noexcept»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- try, catch, throw
- Безопасность исключений
- Спецификатор noexcept
- Пользовательские типы исключений