このコードがコンパイルされないのはなぜですか?
std::map<int,std::pair<int,int>> m;
m.emplace(1,1,1);
のコードを編集できると仮定すると、std::map::emplace
以前のコードを有効にするために変更することは可能ですか?
このコードがコンパイルされないのはなぜですか?
std::map<int,std::pair<int,int>> m;
m.emplace(1,1,1);
のコードを編集できると仮定すると、std::map::emplace
以前のコードを有効にするために変更することは可能ですか?
これが無効であるのとまったく同じ理由で無効です。
std::pair<const int, std::pair<int, int>> p{1, 1, 1};
上記は、本質的に、マップのemplace
要約です。
それを機能させるには、まさにこの目的のために導入された のpiecewise_construct
コンストラクターをstd::pair
使用できます。
m.emplace(
std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple(1, 1)
);
これにより、不要なコンストラクターを呼び出さないという望ましい効果が得られます (省略される可能性が高い場合でも)。
「直接」構文を機能させることについての仮説的な質問に答えるには、一般的に任意map<K, V>
の 、いいえ。これを想像してください:
struct Proof {
Proof(int);
Proof(int, int);
};
std::map<Proof, Proof> m;
m.emplace(1, 1, 1); // Now what?
の限られたケースで確実に機能させることができmap<T, std::pair<T, T>>
ます。大量の高度なテンプレート トリック ( SFINAE の左、右、中央、そしていくつかを考えてみてください) の助けを借りて、もう少し一般的なものでもおそらく実行可能です。それが価値があるかどうかは、状況の詳細によって異なります。