私は推測することができますが、それはC言語に追加されたためだと思います。rvalue参照と転送参照は言語に追加されます。
したがって、APIの一部に転送参照があり、一部ではそうではありませんでした。
1つのマイナーな利点があります:std::function(F const&)
はできませんが動きは、std::function(F)
は、スローしないことが保証できないことができますがF
のコピーコンストラクタが投げることができれば。違いは、コピーはtemplate<class F> function(F)
の場合はコンストラクタの外側で行われますが、値が0以外の場合はtemplate<class F> function(F&&)
のコンストラクタ内でコピーが行われる点です。
これは説得力のある理由ではありません。
SFINAEの振る舞いをfunction(F)
と指定するほうがずっと簡単ですが、C++ 11以降は形式化されていないため、その理由にはなりません。
template<class F>function(F)
へのコストは低いです - F
の完璧なフォワーディングバージョンに対する1回の移動 - だから、誰かの優先順位リストに変更がない可能性が高いです(特に、 "function(F)
のテスト、そして実際には理論上、いくつかの奇妙なコードが壊れる可能性があります)。
しかし 'std :: function'は複数のコンストラクタと複数の演算子=を持っています。移動演算子=に対応する移動コンストラクタを含む。 – michalsrb
彼の例「F &&」の@michalsrbはr値参照ではありません –
https://groups.google.com/a/isocpp.org/forum/#!topic/同じ質問がここに表示されているようです。 std-discussion/ozZQh6dEsiA –