std::mem_fn
でref修飾メンバ関数を使用する方法はありますか?ref_qualifiedメンバ関数を持つstd :: mem_fn
以下のコードはコンパイルに失敗します。
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: 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)(); ~~~~~~~~~~~~~~^
はコンパイラ:クラン(3.4)とg ++(5.3)の両方で
私が作ることができると思いました実際には、std::_Mem_fn
クラス実装では、以下のようにrvalueオブジェクトが呼び出されます。
return (std::move(__object).*__pmf)(std::forward<_Args>(__args)...);
これは、rvalue this
に固有のメンバー関数を呼び出す可能性がありますが、コンパイル時にシグネチャが異なるため、それはできません。
これは、なぜこれが代わりにref修飾子に基づいてオーバーロードされないのかと考えています。何か案が ? – Arunmu
@Arunmuこの質問とは何が関係していますか? – Barry
コンパイラがそれをそのように実装したのであれば、問題のコードはおそらくうまくいきました。 – Arunmu