2012-01-05 20 views
1

のは、私は右辺値参照を取って、機能を持っているとしましょう:なぜstd :: bind'ed関数に移動する必要はありませんか?

void whatever (std::unique_ptr<int>&&) { 
    // Nothing! 
} 

...と私はプレースホルダにその一つのパラメータをバインドします。

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でコンパイルエラーは、方法によって、次のとおりです。libc++を使用しているとき、私はちょうど逆の結果を得る

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

答えて

5

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

これはgcc4.4バグだと思う。 【func.bind.bind]/P10/B3は、この場合について説明:

  • is_placeholder<TiD>::valueの値j引数がstd::forward<Uj(uj)>であり、その種類はViUj&&ある、ゼロではない場合。

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

+0

興味深い!私は、私が取り組んでいるより複雑なケースがあります。その結果は、周囲のコードのいくつかの副作用にも依存しているようです。 –

+1

うん、GCC 4.7で修正されているようだ。 – Potatoswatter

+0

ちなみに、[func.bind.bind]/p10/b3への参照はどのようにして見つけられますか?それはGoogleがうまくいきません。 –

関連する問題