Простой ответ : Не объявляйте его, кроме как, если вы знаете, что он может выдать, и у вас нет действительно веской причины для этого (например, вы хотите, чтобы ваше приложение вызывало std :: terminateесли копия не может быть сделана).
Спросите себя, какова будет прибыль.Может ли компилятор оптимизировать что-нибудь, когда это не исключение?Я не вижу много случаев, когда это имело бы место (наиболее распространенный случай, когда я вижу оптимизацию для перемещения, так как тогда контейнеры библиотеки std могут использовать его - они проверяют, не является ли операция перемещения исключением, поэтому они могут сохранить свои гарантии).Другое место, где вы можете его использовать, - это когда вы хотите задокументировать, что функция не может выбросить.Это совершенно не так.
С другой стороны, вы больше не сможете восстановиться после возможного исключения, и ваша программа будет остановлена.
Итак, летом вы ничего не получаете, но можете что-то потерять.
Также ознакомьтесь с основными рекомендациями:
E.12:Используйте noexcept при выходе из функции из-за того, что бросок невозможен или недопустим
Название этого правила может быть немного запутанным.В нем говорится, что вы должны объявить функцию как noexcept, если
- она не сгенерирует или
- , то вас не волнует случай исключения.Вы готовы завершить работу программы, потому что не можете обработать исключение, такое как std :: bad_alloc, из-за исчерпания памяти.
Не рекомендуется создавать исключение, если вы являетесь прямым владельцемобъект.
Кстати, следующие специальные функции-члены неявно noexcept:
- Конструктор по умолчанию
- Деструктор (насколько я знаю, дажеесли вы явно добавите его)
- Переместите и скопируйте конструктор
- Переместите и скопируйте оператор присваивания