Является ли noexcept бесполезным, если отказ от броска не требует затрат?

Является ли спецификатор noexcept бесполезным, если ваша реализация имеет модель исключений с нулевой стоимостью (если ничего не выбрасывается)? Каков пример, когда отсутствие noexcept имеет последствия?


person j5w    schedule 03.09.2020    source источник
comment
Связано: stackoverflow.com/questions/63727975/   -  person j5w    schedule 03.09.2020


Ответы (1)


Является ли спецификатор noexcept бесполезным, если ваша реализация имеет модель исключений с нулевой стоимостью (если ничего не выбрасывается)?

Нет, noexcept было бы полезно, даже если бы исключения вообще не влияли на производительность.

Одним из примеров является то, что noexcept может сигнализировать о том, какой алгоритм можно использовать. Например, алгоритмы, использующие std::move_if_noexcept или многие из стандартных type_traits может вести себя по-разному в зависимости от наличия noexcept.

Это может оказать существенное влияние на общие функции, такие как std::vector, которые будут намного медленнее, если конструктор перемещения ваших элементов не noexcept. std::vector будет копировать все элементы при перераспределении вместо их перемещения, если конструктор перемещения не noexcept, чтобы сохранить строгую гарантию исключения.

person François Andrieux    schedule 03.09.2020
comment
Почему кто-то предпочитает копировать, если оба могут бросить? - person j5w; 03.09.2020
comment
@lajoh90686 lajoh90686 Если вы начнете перемещать элементы, а один из них выбросит, отменить изменения невозможно. У вас есть два массива, каждый из которых содержит часть элементов, и вы не можете быть уверены, что перемещение их обратно сработает (поскольку очевидно, что перемещение может завершиться неудачно). Если вы начнете копировать элементы, а один выбросит, вы можете просто выбросить новый частично скопированный массив, а старые данные будут сохранены. - person François Andrieux; 03.09.2020
comment
Интересно. Так что для семантики перемещения это полезно. Что-то еще? - person j5w; 03.09.2020
comment
@ lajoh90686 практически в любое время, когда вы хотите обеспечить надежную гарантию исключения - person Caleth; 03.09.2020