В С++17 не работает std::function<R(...) noexcept>

Yuriy Chernyshov
Yuriy Chernyshov

Причина в том, что noexcept стал учитываться в сигнатуре функции, а определение std::function исправить забыли.

Подробнее — здесь:
https://stackoverflow.com/questions/41293025/stdfunction-with-noexcept-in-c17

Это баг в стандарте.

3
рейтинг
в разработке
5 комментариев
yndx-antoshkka

Данный noexcept в сигнатуре особо компилятору ничем не поможет:

operator()(ArgTypes...) const по прежнему может кидать исключение, в случае пустого std::function.

Можно добавить

template<class R, bool B, class... ArgTypes>
class function<R(ArgTypes...) noexcept(B) > : public function<R(ArgTypes...)> {
    using std::function<R(ArgTypes...)>::function;
};

для того, чтобы просто компилировался std::function<void()noexcept>. Такой вариант устроит, или хочется чего-то большего?

yndx-antoshkka
Yuriy Chernyshov

yndx-antoshkka, хочется дать понять клиенту, что функция не должна кидать исключений (например потому, что мы собираемся вызвать её в деструкторе — см. паттерн scoped_guard).

Помощь компилятору — дело десятое.

 

 

Yuriy Chernyshov
Andrey

yndx-antoshkka, в этом случае можно убрать шаблонный параметр B, оставив

template<class R, class... ArgTypes>
class function<R(ArgTypes...) noexcept> : public function<R(ArgTypes...)> {
    using function<R(ArgTypes...)>::function;
};

`void () noexcept(false)` и `void ()` это один и тот же тип.

Andrey
Andrey

Yuriy Chernyshov, я правильно понял Вашу идею, что если сейчас на конструктор template<class F > function( F f )накладывается ограничение "This constructor does not participate in overload resolution unless f is Callable for argument types Args... and return type R" то от конструктора function<R(...) noexcept> нужно требовать, чтобы его параметр был NothrowCallable?

Andrey
Обновлено 
asschool

Yuriy Chernyshov, для этого просто не подходит std::function

asschool
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения