Выписка из лекции Полубенцевой М.И.:
Как компилятор использует noexcept
Важно!
• Спецификация noexcept – это способ для
программиста предоставить компилятору
информацию о том, что функция не будет
генерировать исключения
• Получив информацию о том, что функция
безопасна, компилятор может использовать
дополнительные оптимизации
• Например, некоторые контейнеры (vector)
поддерживают перемещение элементов только в
том случае, когда move конструктор noexcept, а в
противном случае вызывают глубокое копирование
Специфика noexcept
• Спецификатор времени компиляции
noexcept значительно уменьшает размер
итогового файла и ускоряет работу
программы.
• => полезно его использовать «по делу»!!!
• если функция со спецификатором noexcept
все-таки сгенерирует исключение, то будет
вызвана std::terminate() => аварийное
завершение.
C++ (Qt)
struct Bad{
Bad() {}
Bad(Bad&&); // из сигнатуры не следует, что функция безопасна
=> компилятор исходит из того, что может генерировать исключения
Bad(const Bad&); // аналогично
};
int main()
{
Bad b;
Bad b2 = std::move_if_noexcept(b); // Bad(const Bad&)
}
C++ (Qt)
struct Good{
Good() {}
Good(Good&&) noexcept; // не генерирует исключений!
Good(const Good&) noexcept; // тоже не генерирует исключений!
};
int main()
{
Good g;
Good g2 = std::move_if_noexcept(g); // Good(Good&&)
}