Arcoth added a comment.
In https://reviews.llvm.org/D32824#745392, @EricWF wrote:
> This change regresses other code. By changing `__bind_return<...>::type` into
> `decltype(auto)` you prevent the member functions from SFINAE'ing. For
> example:
>
> #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)(); // Broken after your change.
> }
>
>
> This patch cannot introduce regressions but changing to using
> `decltype(auto)` does. I'm not sure the behavior you want is possible. The
> library is required to evaluate the validity of calling the specified functor
> in the signature of the call operator in order to correctly SFINAE.
> I think this makes accepting the code in PR32856 impossible.
This is **intended **to fail (as I also mentioned in the motivating SO post
<http://stackoverflow.com/a/43696236/3647361>). The type of the object argument
`fd` is `FD`, where `FD `is `decay_t<Func>`, i.e. `Func`. That's it. And if we
use a non-`const ` object argument, overload resolution prefers non-`const`
member functions per se, hence we should get a diagnostic saying that a deleted
function is called. Alternatively, some other construct inside `bind` should
fail: libstdc++'s `bind` somehow requires `result_of_t<Func&()>`, which fails.
In short, this was never intended to work; the fact that it does is a
consequence of the return type being denoted in an expression SFINAE manner.
https://reviews.llvm.org/D32824
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits