1

右辺値参照を取る関数があるとしましょう:

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> >)'
4

1 に答える 1

5

libc++を使用すると、正反対の結果が得られます。

std::unique_ptr<int> nothing;
f(std::move(nothing));  // Works!
f(nothing);             // Fails to compile!

これは gcc4.4 のバグだと思います。[func.bind.bind]/p10/b3 では、このケースについて説明しています。

  • の値jis_placeholder<TiD>::valueゼロでない場合、引数はstd::forward<Uj(uj)>であり、その型ViUj&&です。

これは、最近の gcc で修正される可能性があります (わかりません)。

于 2012-01-05T16:57:55.510 に答える