【发布时间】:2016-11-27 08:42:41
【问题描述】:
有什么方法可以通过std::mem_fn 使用 ref 限定成员函数?
以下代码编译失败:
class DeadPool {
public:
void jump() & {
std::cout << "Did not jump\n";
}
void jump() && {
std::cout << "Jumped from helicopter\n";
}
};
int main() {
DeadPool dp1;
//auto cobj = std::mem_fn(&DeadPool::jump); // Won't compile
//cobj(dp1);
//cobj(DeadPool());
using Func = void (DeadPool::*) () &; // lvalue ref qualifier explicitly provided
Func fp = &DeadPool::jump; // This works, as expected
(std::move(dp1).*fp)();
return 0;
}
错误信息:
mem_fn_ex.cc:18:15:错误:没有匹配的函数调用“mem_fn”
自动 cobj = std::mem_fn(&DeadPool::jump); // 不会编译 ^~~~~~~~~~~ /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/functional:1233:1: 注:候选人 模板被忽略:无法推断模板参数“_Rp”mem_fn(_Rp _Tp::* __pm)^ mem_fn_ex.cc:23:18:错误:指向成员的指针 函数类型 'Func' (aka 'void (DeadPool::*)() &') 可以 只能在左值上调用 (std::move(dp1).*fp)(); ~~~~~~~~~~~~~~^^
编译器:在 Clang(3.4) 和 g++ (5.3) 上
我想我可以利用这样一个事实,在std::_Mem_fn 类实现中,一个右值对象被如下调用:
return (std::move(__object).*__pmf)(std::forward<_Args>(__args)...);
这可能很好地调用了特定于右值this 的成员函数,但由于在编译时签名不同,它不能这样做。
【问题讨论】: