noexcept используется крайне редко в стандарте c ++ . Это единственный барьер.
В то время как это отвечает на вопрос, следующий вопрос - «почему это используется экономно». Это дополнительная информация, которая может оказаться полезной; если бы это было ядром ответа, я бы включил больше цитат вместо ссылок. Бумажные номера должны пережить конкретные гиперссылки, которые я использую, так что это так.
N3279 является заключением дискуссии о noexcept. По сути, все, что имеет узкий контракт (может иметь UB) и не является движением ctor или dtor, никогда не помечается как noexcept.
Вот рекомендации:
Принятые руководящие принципы
- Никакой деструктор библиотеки не должен бросать. Они должны использовать неявно предоставленную (не генерирующую) спецификацию исключений.
- Каждая библиотечная функция, имеющая широкий контракт, который, как соглашается LWG, не может выдать, должна быть помечена как безусловно noexcept.
- Если библиотечная функция подкачки, оператор перемещения или конструктора перемещения является условно-широкой (т. Е. Может быть доказано, что она не выбрасывает с помощью оператора noexcept), то она должна быть помечена как условно noexcept. Никакая другая функция не должна использовать условную спецификацию noexcept.
- Библиотечные функции, разработанные для совместимости с кодом «C» (например, средство атомарного анализа), могут быть помечены как безоговорочные
noexcept.
Я не участвовал в обсуждении, но в основном идея заключается в том, что компилятор может добавлять исключения к этим методам.
Я считаю, что это называется правилом Лакоса. Чтобы изменить это, возьмите это с комитетом.
N3248 - бумага, в которой возникли проблемы без исключения. В основном речь идет о тестировании.