Есть ли автоматический спецификатор noexcept?

Я слышал, что ключевое слово noexcept больше похоже на "он никогда не должен генерировать исключение", а не "нет".

Я не думаю, что полезно использовать ключевое слово noexcept, если я не уверен, что он генерирует исключение или нет, но ключевое слово noexcept иногда связано с производительностью, как в конструкторе перемещения.

Итак, я попытался использовать квалификаторы noexcept, но становится все сложнее, если в определении есть несколько операторов, и это становится своего рода копированием и вставкой.

template <class T>
void f(T&& t)
    noexcept(noexcept(statement_1) &&
             noexcept(statement_2) &&
             noexcept(statement_3) &&
             noexcept(statement_4) &&
             noexcept(statement_5))
{
    statement_1;
    statement_2;
    statement_3;
    statement_4;
    statement_5;
}

Я думаю, что компилятор может выяснить, состоит ли определение функции из неперебрасывающих операторов, поэтому будет легче использовать noexcept, если есть выражение типа noexcept(auto), но кажется, что нет такого вещь в стандарте.

Есть ли способ упростить выражение noexcept?

Ответ 1

В настоящее время их нет. Однако есть предложение по этой теме, в котором предлагается синтаксис noexcept(auto): http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4473 Статус этого предложения "нуждается в дальнейшей работе", согласно Botond Ballo "Отчет о поездке: Совещание по стандартам С++ в Ленексе, май 2015 года" https://botondballo.wordpress.com/2015/06/05/trip-report-c-standards-meeting-in-lenexa-may-2015/

Дальнейшая работа. Направленность предложений многообещающая, но она либо не достаточно хорошо конкретизируется, либо существует определенная проблема с одним или несколькими проектами. Автору предлагается вернуться с измененным предложением, которое более скомпоновано и/или устраняет указанные проблемы.

...

noexcept (auto), что в основном означает "вывести noexcept-ness этой функции из неэксклюзивности функций, которые она вызывает". Подобно выводу типа возврата, для этого требуется, чтобы тело функции было доступно в каждой единицы перевода, использует эту функцию. Было показано, что вместе с предложением о создании спецификаций исключений из системы типов это будет означать, что изменение тела функций может изменить тип функций (опять же, как и вывод типа возврата), но люди чрезмерно обеспокоены этим.