https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80564
--- Comment #5 from r.hl at gmx dot net --- See also the discussion on Phabricator: https://reviews.llvm.org/D32824 I agree; AFAICS [func.bind.bind] is clear on this: the type of the Func object used to call the member operator() is non-const. On 5/4/2017 9:09 PM, rs2740 at gmail dot com wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80564 > > TC <rs2740 at gmail dot com> changed: > > What |Removed |Added > ---------------------------------------------------------------------------- > CC| |rs2740 at gmail dot com > > --- Comment #4 from TC <rs2740 at gmail dot com> --- > (In reply to Eric Fiselier from comment #3) >> Here is an example of why `_Bind::operator()(...) const` must be considered >> during overload resolution even if the call wrapper itself is not const. >> >> ------------------------------ >> #include <functional> >> >> struct Func { >> template <class ...Args> >> void operator()(Args&&...) = delete; >> >> template <class ...Args> >> void operator()(Args&&...) const {} >> }; >> >> int main() { >> Func f; >> std::bind(f)(); >> } >> ------------------------- > Interesting, libstdc++ rejects this as an attempt to call a deleted function. > That seems more correct than libc++'s approach which calls the const overload. >