2017-03-02 27 views
0

std::promise<>が非参照型でインスタンス化されている場合、set_value()メソッドには値オーバーロードによる1回のオーバーロードとは異なる2つの異なるオーバーロードがあります。なぜstd :: promise :: set_value()に2つのオーバーロードがあるのです

ので、代わりに次の2つの

std::promise::set_value(const Type& value); 
std::promise::set_value(Type&& value); 

一つだけ。これは、少なくとも次の2つの利点が

  1. 約束に値を移動するには、ユーザーを有効にしている

    std::promise::set_value(Type value); 
    

    /将来、API引数が値型であるためコピーがサポートされていない場合、値がコピーされることは明らかです。さらに、関数に渡される式が正値である場合、コンパイラによって完全に省略することができます(特にC++では特にそうです)

  2. クラスが値のコピーをたくさん必要とする点を伝えます同じタスクを達成する2つの過負荷よりも優れています。

私は(限り、所有権が懸念していると)同様のAPIを作っていたと私はCが採用し、デザインの決定に利益をもたらすと思いまし++標準ライブラリは、私が言及したものに対立するものとして持っています。

ありがとうございます!

答えて

1

引数を値渡しで無条件に転送する必要がある場合は、値を引数に渡してからそれから移動するのはちょっとしたトリックですが、少なくとも1つの強制移動が発生します。したがって、このトリックは、まれにしか使用されないリーフコード、または作成者の制御下にある状況でのみ最適です。

対照的に、ユーザと使用者が主に作者に知られていないコアライブラリは、不必要にコストを追加してはいけません。また、2つの個別の参照パラメータオーバーロードを提供するほうが効率的です。

簡単に言えば、リーフとユーザーが多いほど、マイクロ最適化よりもシンプルさを優先する必要があります。ライブラリーが多いほど、一般的で効率的な方法から離れる必要があります。

+0

これは理にかなっており、大きなアドバイスです、ありがとうございます! – Curious

関連する問題