У меня есть следующий фрагмент кода:result_of не определяет тип для mem_fn
#include <functional>
struct X {
int get() const& {
return 42;
}
};
template<typename Func>
std::result_of_t<Func(X)> Apply(Func fn) {
X x;
return fn(x);
}
int main(void) {
Apply([](X const& x){return x.get();});
//Apply(std::mem_fn(&X::get)); // does not compile
}
Первый вызов Apply
компилируется нормально, но если я раскомментировать второй вызов, я получаю следующее сообщение об ошибке компиляции:
main.cpp:16:5: error: no matching function for call to 'Apply'
Apply(std::mem_fn(&X::get)); // does not compile
^~~~~
main.cpp:10:27: note: candidate template ignored: substitution failure [with Func = std::_Mem_fn<int (X::*)() const &>]: no type named 'type' in 'std::result_of<std::_Mem_fn<int (X::*)() const &> (X)>'
std::result_of_t<Func(X)> Apply(Func fn) {
^
Я как-то ожидал, что оба вызова могут использоваться взаимозаменяемо, и что std::mem_fn
просто «пойдет правильно». Может ли кто-нибудь объяснить, что здесь происходит?
Предлагаю детализировать, почему тоже работает лямбда :) – Quentin
'const &' связывается с rvalues. –
@ T.C. да, но ref-qualifiers фактически не связаны с привязкой ссылки - они напрямую ограничивают категорию вызывающего объекта. – Quentin