1

私の前の質問の答えによると、

std::pair<iterator, bool> std::unordered_map::insert(const value_type&)

よりも便利です

template<class P>
std::pair<iterator, bool> std::unordered_map::insert(P&&)

のようないくつかの状況のた​​めに

std::unordered_map<std::string, int> v;
v.insert({"key", 1});

Pコンパイラはから推論できないため{"key", 1}です。(sellibitzeに感謝します)

ただし、この引数{"key", 1}(= std::pair<std::string, int>("key", 1))はprvalueですが、引数の型が。であるため、コンテナに移動できませんconst value_type&

私の質問は---永続的に申し訳ありません---なぜ標準const value_type&が引数タイプの代わりに引数タイプを選択するのvalue_type&&ですか?const value_type&または、引数型の関数が存在し、引数型の関数が存在しない理由は他にありvalue_type&&ますか?

編集:サンプルを作成しました。

4

1 に答える 1

4

for()()の「欠落している」value_type&&オーバーロードは意図的なものです。 です。移動中のかなりの雨-セマンティクスパレード。insertunordered_multimapvalue_typepair<const key_type, value_type>constkey_type

私は本当に、からの移動を許可したかったpair<key_type, value_type>ので、オーバーロードの導入を許可しましたP&&。後から考えると、それは最善の解決策ではなかったかもしれません。しかし、それは意図的な設計上の決定でした。

決定された時点では、統一初期化の提案は出ていませんでした。そのため、標準化の前にそれとの相互作用が徹底的に調査されることはありませんでした(十分な時間/人員がないだけです)。

過負荷はC++98から発生し、const value_type&それを削除または変更することは決して考慮されていませんでした。

于 2013-02-07T19:18:41.097 に答える