Например, довольно распространено иметь два отдельных способа доступа к элементам частного массива, перегрузку оператора подписи текста массива или определение at
:
T& operator[](size_t i) { return v[i]; }
T const& operator[](size_t i) const { return v[i]; }
T& at(size_t i)
{
if (i >= length)
throw out_of_range("You shall not pass!");
return v[i];
}
T const& at(size_t i) const
{
if (i >= length)
throw out_of_range("You shall not pass!");
return v[i];
}
Версия at
может генерировать исключение, но оператор подписи текста массива не может.
Мой вопрос в том, что если operator[]
не генерирует исключение, может ли он быть помечен как noexcept
, даже зная, что он может поднять сигнал SIGSEGV или это только плохая практика?
Я хочу указать, что сигнал (как SIGSEGV) не является исключением. Буквально интерпретируя смысл noexcept
, функция noexcept
- это та, которая утверждает, что не будет генерировать исключения. Он ничего не говорит ни о чем другом (включая сигналы).
Но функция noexcept
имеет большее значение, чем это, по крайней мере для клиентов моего кода. noexcept
также неявно говорит, что функция безопасна, и она завершит свое выполнение без вычислительных ошибок.
Итак, нецелесообразно ли отмечать noexcept
функцию, которая небезопасна?