Подтвердить что ты не робот

Почему std:: array:: front и std:: array:: back not noexcept?

Я новичок в использовании спецификатора noexcept, и я не понимаю, почему std::array::front и std::array::back не объявлены noexcept (тогда как std::array::begin и std::array::end есть).

В чем причина этого?

4b9b3361

Ответ 1

От cppreference

Существует специальный случай для массива нулевой длины (N == 0). В этом случае array.begin() == array.end(), что является некоторым уникальным значением. Эффект вызова front() или back() в массиве нулевого размера равен undefined.

Итак, поскольку мы можем иметь массив размером 0 front() и back(), может вызвать исключение

Чтобы процитировать Себастьян Редл на , почему стандарт не имеет мандата operator[], front и back быть отмечены noexcept

Стандартная политика noexcept заключается в том, чтобы отмечать только те функции, которые не могут или не должны терпеть неудачу, но не те, которые просто указываются не для исключения исключений. Другими словами, все функции, имеющие ограниченный домен (передать неправильные аргументы и вы получите поведение undefined), не являются noexcept, даже если они не заданы для throw.