[Bug libstdc++/52917] [DR 2048] explicitly stated return type in std::mem_fn cannot be compiled
redi at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Apr 10 11:24:00 GMT 2012
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52917
--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> 2012-04-10 11:23:51 UTC ---
(In reply to comment #3)
> Ok, I didn't know about the defect report and resolution yet.
> I must admit that I quite like the <int&()> syntax.
It's a peculiarity of the C++ grammar, the function parameter R T::*pm is a
pointer to member, with T deduced as X and R deduced as the function type
int&()
If it helps, consider that you can declare X::get() like this:
#include <functional>
struct X
{
int a;
typedef int& func_type();
func_type get;
};
int& X::get() { return a; }
And then you can use the typedef with mem_fn:
auto pm = std::mem_fn<X::func_type>(&X::get);
> I added a remark about the defect and a short example to
> http://en.cppreference.com/w/cpp/utility/functional/mem_fn
N.B. That page has a heading "Execptions"
> And I noted that the most c++11-ish code would be anyway:
>
> auto y = [] (X& x) {return x.get();};
In most cases yes, but mem_fn has the advantage it always returns the same
type, whereas two lambda expressions produce two different closure types even
if the expressions are identical, and mem_fn might be easier to use in
late-specified return types.
More information about the Gcc-bugs
mailing list