5

このコードがコンパイルされないのはなぜですか?

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

のコードを編集できると仮定すると、std::map::emplace以前のコードを有効にするために変更することは可能ですか?

4

1 に答える 1

10

これが無効であるのとまったく同じ理由で無効です。

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 の左、右、中央、そしていくつかを考えてみてください) の助けを借りて、もう少し一般的なものでもおそらく実行可能です。それが価値があるかどうかは、状況の詳細によって異なります。

于 2016-04-28T06:20:06.503 に答える