Có cách nào để chúng tôi có thể sử dụng chức năng thành viên đủ điều kiện với std::mem_fn
không?std :: mem_fn với chức năng thành viên ref_qualified
Mã dưới đây không biên dịch: Thông điệp
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;
}
Lỗi:
mem_fn_ex.cc:18:15: error: no matching function for call to 'mem_fn'
auto cobj = std::mem_fn(&DeadPool::jump); // Won't compile ^~~~~~~~~~~ /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/functional:1233:1: note: candidate template ignored: couldn't infer template argument '_Rp' mem_fn(_Rp _Tp::* __pm)^mem_fn_ex.cc:23:18: error: pointer-to-member function type 'Func' (aka 'void (DeadPool::*)() &') can only be called on an lvalue (std::move(dp1).*fp)(); ~~~~~~~~~~~~~~^
Compiler: Trên cả Clang (3.4) và g ++ (5.3)
tôi nghĩ rằng tôi có thể làm cho sử dụng thực tế rằng, trong việc thực hiện lớp học std::_Mem_fn
một đối tượng giá trị được gọi như sau:
return (std::move(__object).*__pmf)(std::forward<_Args>(__args)...);
Điều này có thể đã gọi rất tốt chức năng thành viên cụ thể cho rvalue this
, nhưng vì chữ ký khác với thời gian biên dịch nên không thể thực hiện điều đó.
Điều này khiến tôi nghĩ tại sao 'này' không bị quá tải dựa trên vòng loại ref thay thế. Bất kỳ ý tưởng ? – Arunmu
@Arunmu Điều đó có liên quan gì đến câu hỏi này? – Barry
Vâng, nếu trình biên dịch thực hiện nó theo cách đó, mã trong câu hỏi có thể đã làm việc. – Arunmu