В «Исключительной безопасности», созданной Abrahams, у нас есть три гарантии: базовая, сильная и гарантия без бросков.
Могу ли я сказать, что если у меня есть кодовая база, использующая nothrow для «нового» и noexcept для сигнатур методов, у меня есть гарантия no-throw?
Благодарю.
Нет, это не правильный вывод. Гарантия безбрасывания не просто означает, что вы не генерируете исключения, это означает, что операция всегда завершается успешно. База кода с использованием распределителя, который возвращает nullptr
в случае сбоя и указывает на сбой функции, возвращая код состояния, довольно явно не соответствует этому. Также не кодовая база, которая вызывает abort()
на любую обнаруженную ошибку. Тем не менее, оба из них вполне возможны с new(nothrow)
а также noexcept
функции.
Вам придется избегать (или обрабатывать и восстанавливать после возможных сбоев) следующие языковые конструкции:
dynamic_cast
к ссылочному типу, который будет выбрасывать std::bad_cast
если конверсия не удалась;typeid
применяется к результату разыменования потенциально нулевого указателя, который будет выбрасывать std::bad_typeid
И, конечно, вам придется избегать большей части стандартной библиотеки. В частности, такие вещи, как контейнеры, используют распределители, которые могут сигнализировать только о сбое, бросая.
Вы будете изо всех сил пытаться дать гарантию отсутствия бросков через «кодовую базу» (если под этим вы подразумеваете код для всей программы или библиотеки), поскольку, как правило, будут операции, которые, как ожидается, завершатся сбоем; они могут иметь максимум сильную гарантию.