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
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to