Вы действительно задаете этот вопрос неправильным образом. Решение об использовании noexcept
обычно должно быть сверху вниз (например, делает ли это когда-либо вопрос вызывающей функции) не снизу вверх (т. Е. На основе того, что делает ваша функция).
Существует разница между указанием того, что что-то «не должно бросать» против «не нужно бросать». noexcept
подходит для использования в случаях «никогда не бросать», а не «не нужно бросать». Но решение по которому уместно, зависит от потребностей вызывающих функций, а не от того, как реализуется функция.
Оставив noexcept
, разрешена возможность использования металической версии функции, например, для отладки. Функция в категории «не нужно бросать» может быть безопасно заменена металической версией во время отладки, а затем использовать не-бросающую версию в сборке «release». Такие проверки нежелательны в сборке «release», потому что они часто отрицательно влияют на показатели производительности программы - а также могут вызвать нежелательные побочные эффекты в некоторых случаях (например, если проверки делают что-то вроде пробного стека вызовов или отслеживают использование общей памяти программа).
Это является причиной того, что operator[]
для std::vector
не nothrow
- это не указано, как бросание, но заменив его версии метания может быть полезно для отладки. Если он был указан как nothrow
, это уменьшило бы возможности разработчиков отлаживать их код - который использует стандартную библиотеку - до выпуска.
Второй вопрос задается здесь: http://stackoverflow.com/questions/20517259/why-vector-access-operators-are-not-specified-as-noexcept –
@JamesRoot Спасибо большое! – Caesar