2016-09-13 5 views
8

std::functionタイプ消去コンストラクタは次のように定義される:operator=ながらコンストラクタは、値によってfを取得しない理由std :: functionコンストラクタと代入の違いは何ですか?

template< class F > 
function& operator=(F&& f); 

(ソースcppreference)

:代入演算子は次のように定義される

template< class F > 
function(F f); 

転送参照でfを取得しますか?

+2

しかし 'std :: function'は複数のコンストラクタと複数の演算子=を持っています。移動演算子=に対応する移動コンストラクタを含む。 – michalsrb

+2

彼の例「F &&」の@michalsrbはr値参照ではありません –

+1

https://groups.google.com/a/isocpp.org/forum/#!topic/同じ質問がここに表示されているようです。 std-discussion/ozZQh6dEsiA –

答えて

3

私は推測することができますが、それは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)のテスト、そして実際には理論上、いくつかの奇妙なコードが壊れる可能性があります)。

+0

しかし、もしそうなら、 'std :: function :: assign'はC++では非推奨になっていますが、コンストラクタのシグネチャは変更されていませんか?つまり、誰かが 'std :: function' APIの改良についていくつか考えをしていたが、コピー可能コピー可能コンストラクタをそのまま残した –

関連する問題