Russian Qt Forum

Программирование => С/C++ => Тема начата: ksk- от Январь 09, 2017, 18:03



Название: Использование спецификатора noexcept
Отправлено: ksk- от Январь 09, 2017, 18:03
Всем привет! Вопрос: Имеет ли смысл объявлять функции как noexcept, если проект собирается без исключений? Если да, то почему?


Название: Re: Использование спецификатора noexcept
Отправлено: Пантер от Январь 09, 2017, 20:52
ИМХО, не имеет. Единственное, это могут потребовать виртуальные методы с noexcept, которые ты переопределяешь.


Название: Re: Использование спецификатора noexcept
Отправлено: __Heaven__ от Январь 16, 2017, 15:03
Выписка из лекции Полубенцевой М.И.:

Как компилятор использует 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&&)
}