Достаточно ли nothrow / noexcept, чтобы сказать, что у нас есть гарантия без бросков?

В «Исключительной безопасности», созданной Abrahams, у нас есть три гарантии: базовая, сильная и гарантия без бросков.
Могу ли я сказать, что если у меня есть кодовая база, использующая nothrow для «нового» и noexcept для сигнатур методов, у меня есть гарантия no-throw?

Благодарю.

3

Решение

Нет, это не правильный вывод. Гарантия безбрасывания не просто означает, что вы не генерируете исключения, это означает, что операция всегда завершается успешно. База кода с использованием распределителя, который возвращает nullptr в случае сбоя и указывает на сбой функции, возвращая код состояния, довольно явно не соответствует этому. Также не кодовая база, которая вызывает abort() на любую обнаруженную ошибку. Тем не менее, оба из них вполне возможны с new(nothrow) а также noexcept функции.

2

Другие решения

Вам придется избегать (или обрабатывать и восстанавливать после возможных сбоев) следующие языковые конструкции:

  • dynamic_cast к ссылочному типу, который будет выбрасывать std::bad_cast если конверсия не удалась;
  • typeid применяется к результату разыменования потенциально нулевого указателя, который будет выбрасывать std::bad_typeid

И, конечно, вам придется избегать большей части стандартной библиотеки. В частности, такие вещи, как контейнеры, используют распределители, которые могут сигнализировать только о сбое, бросая.

Вы будете изо всех сил пытаться дать гарантию отсутствия бросков через «кодовую базу» (если под этим вы подразумеваете код для всей программы или библиотеки), поскольку, как правило, будут операции, которые, как ожидается, завершатся сбоем; они могут иметь максимум сильную гарантию.

2

По вопросам рекламы [email protected]