2016-04-28 5 views
4

なぜこのコードはコンパイルされませんか?ペアのstd :: mapに直接記入

std::map<int,std::pair<int,int>> m; 
m.emplace(1,1,1); 

、我々はstd::map::emplaceのコード編集できると仮定すると、それは、前のコードが有効にするために、それを変更することは可能でしょうか?

答えて

8

無効であるとまったく同じ理由で無効です:

std::pair<const int, std::pair<int, int>> p{1, 1, 1}; 

の上にある、本質的には、どのようなマップのemplaceは、つまるところので。

それを動作させるために、あなたはまさにこの目的のために導入されたpiecewise_construct constructor of std::pairを、使用することができます。

m.emplace(
    std::piecewise_construct, 
    std::forward_as_tuple(1), 
    std::forward_as_tuple(1, 1) 
); 

これは、彼らが可能性が省略されることになる場合でも、(不要なコンストラクタを呼び出していないの所望の効果を持つことになります)。


「直接」構文の作業を行うことについてのあなたの仮定の質問に答えるために:任意のmap<K, V>のための一般的なケースでは、ありません。あなたは確かにそれはmap<T, std::pair<T, T>>の限定された場合のために働く作ることができる

struct Proof { 
    Proof(int); 
    Proof(int, int); 
}; 

std::map<Proof, Proof> m; 
m.emplace(1, 1, 1); // Now what? 

:これを想像してみてください。 という大量のアドバンステンプレートのトリック(左右、右、中央、そしていくつかのものを考えてください)の助けを借りて、もう少し一般的なものを実行するのはおそらく可能です。それが価値があるかどうかは、あなたの状況の詳細によって決まります。

+0

一般的には、区分的なコンストラクタをサポートするクラスも必要です –

関連する問題