右辺値参照を取る関数があるとしましょう:
void whatever (std::unique_ptr<int>&&) {
// Nothing!
}
...そして、その 1 つのパラメーターをプレースホルダーにバインドします。
auto f = std::bind(&whatever, _1);
私はこのような呼び出しを試みましたが、結果は私が期待していたものとは逆です。
std::unique_ptr<int> nothing;
f(std::move(nothing)); // Fails to compile!
f(nothing); // Works, but seems wrong!
これはコンパイラのバグですか? または、動作中の呼び出しは安全でないコードですか? std::move
または、バインドされた関数へのこのポインターを必要としないのはなぜですか?
ちなみに、gcc4.4 でのコンパイル エラーは次のとおりです。
test.cxx:14: error: no match for call to '(std::_Bind<void (*(std::_Placeholder<1>))(std::unique_ptr<int, std::default_delete<int> >&&)>) (std::unique_ptr<int, std::default_delete<int> >)'