cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

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

Closed apolukhin closed 10 months ago

apolukhin commented 3 years ago

Перенос предложения: голоса +6, -0 Автор идеи: Yuriy Chernyshov

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

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

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

apolukhin commented 3 years ago

yndx-antoshkka, 6 августа 2018, 13:05 Данный 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>. Такой вариант устроит, или хочется чего-то большего?

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

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

Andrey, 6 августа 2018, 22:20 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, 6 августа 2018, 22:25 Yuriy Chernyshov, я правильно понял Вашу идею, что если сейчас на конструктор template 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?

Айдар Фаттахов, 8 августа 2018, 19:13 Yuriy Chernyshov, для этого просто не подходит std::function

Yuriy Chernyshov, 23 августа 2018, 22:44 asschool, почему?

yndx-antoshkka, 21 августа 2018, 15:38 Решить по быстрому не получается, отложил на потом.

yndx-antoshkka, 28 февраля 2019, 12:19 Есть предложение http://wg21.link/p0045 которое это чинит

apolukhin commented 10 months ago

Поправили в С++26 добавлением std::copyable_function https://wg21.link/P2548