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

"Ты не бросишь", и noexcept

В стандарте С++ иногда используется фраза "не следует исключать исключения", например, в 17.6.3.4 при перечислении требований Hash. Означает ли это, что стандартная реализация должна отмечать оператор вызова std::hash как noexcept или это просто означает, что выполнение метаданных из хеш-функтора происходит в undefined или в реализации поведение?

Я проверил, что оба оператора libstdС++ и libС++ отмечают std::hash как оператор noexcept, но я хотел бы понять, требуется ли это поведение или нет.

4b9b3361

Ответ 1

"Требуется: не бросать" означает то, что вы догадались: если вы бросите, вы получите поведение undefined.

Кроме того, 17.6.5.12 [res.on.exception.handling]/p1 позволяет разработчикам добавлять исключение-исключение:

Любая из функций, определенных в стандартной библиотеке С++, может сообщить сбой, бросая исключение типа, описанного в его бросках: параграф. Реализация может усилить исключение спецификации для не виртуальной функции путем добавления небрасывающего noexcept-спецификации.

libstdС++ и libС++ mark std::hash оператор вызова как noexcept как соответствующее расширение. Они разрешены, но не требуются для этого.