https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101203
Bug ID: 101203
Summary: Remove unnecessary empty check in std::function
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: lutztonineubert at gmail dot com
Target Milestone: ---
Hello,
this empty() check in std_function.h:
https://github.com/gcc-mirror/gcc/blob/master/libstdc++-v3/include/bits/std_function.h#L558
_Res
operator()(_ArgTypes... __args) const
{
if (_M_empty())
__throw_bad_function_call();
return _M_invoker(_M_functor, std::forward<_ArgTypes>(__args)...);
}
can, as I assume, be removed to gain better performance.
An empty, default constructed std::function could be initialized with
__throw_bad_function_call() instead with nullptr/zeros.
If std::function::operator()(...) gets called, still
__throw_bad_function_call() would get called as before.
The implementation of `explicit operator bool()` or better `_M_empty()` would
then check if the function is initialized with the address of
__throw_bad_function_call.
This would be a similar technic as used in std::any:
https://github.com/gcc-mirror/gcc/blob/master/libstdc++-v3/include/experimental/any#L436