Ваш вопрос: "Это безопасно?"Я бы скорее спросил: «Имеет ли смысл даже объявлять некоторые функции как noexcept только потому, что они не генерируют исключения?».
Строго говоря, есть две вещи, которые предлагает noexcept:
- Каждый может проверить во время компиляции, объявлена ли ваша функция как noexcept.(На практике это полезно только в одной функции std: move_if_noexcept)
- Вы получаете гарантию во время выполнения, что если ваша функция тем не менее пытается выдать исключение, она не выходит из функции (потому что stdВместо этого вызывается :: terminate.
Более интересно перечислить, что noexcept делает not предложение:
- Автоматическая проверка во время компиляции, еслифункция на самом деле не выдает
- Что еще более важно, она не предлагает никакой "гарантии безопасности исключений".
Я считаю, что второй пункт часто пропускается при изучении noexcept,Если вы хотите предоставить гарантию безотказности (обратите внимание, что она отличается от гарантии безбрасывания, поскольку функция может давать сбой, но не выбрасывать), вы можете просто внедрить ее в свою функцию и ничего не бросать, а где-то задокументировать.Вам не нужно отмечать вашу функцию как noexcept.В любом случае это обеспечит безошибочную исключительную безопасность.
Единственным разумным местом для использования noexcept является предоставление конструктора перемещения или назначения перемещения в вашем типе, и только если вы чувствуете, что вам нужно определить их самостоятельно, а не полагаться на версии, сгенерированные компилятором.Это полезно, потому что некоторые операции контейнера STL будут работать быстрее, потому что они используют функцию std :: move_if_noexcept в своих реализациях.
Я также рекомендую эту статью с подробностями о функциональности noexcept.