Closed apolukhin closed 10 months 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
Айдар Фаттахов, 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 которое это чинит
Поправили в С++26 добавлением std::copyable_function https://wg21.link/P2548
Перенос предложения: голоса +6, -0 Автор идеи: Yuriy Chernyshov
Причина в том, что noexcept стал учитываться в сигнатуре функции, а определение std::function исправить забыли.
Подробнее — здесь: https://stackoverflow.com/questions/41293025/stdfunction-with-noexcept-in-c17
Это баг в стандарте.