直接在std :: pair中映射

Hum*_*awi 4 c++ dictionary std-pair emplace c++14

为什么这段代码不能编译?

std::map<int,std::pair<int,int>> m;
m.emplace(1,1,1);
Run Code Online (Sandbox Code Playgroud)

假设我们可以编辑代码std::map::emplace,是否可以更改它以使以前的代码有效?

Rei*_*ica 8

它无效的原因完全相同:

std::pair<const int, std::pair<int, int>> p{1, 1, 1};
Run Code Online (Sandbox Code Playgroud)

因为上面的内容实质上是地图的emplace归结.

为了使它工作,您可以使用为此目的而引入的piecewise_construct构造函数std::pair:

m.emplace(
  std::piecewise_construct,
  std::forward_as_tuple(1),
  std::forward_as_tuple(1, 1)
);
Run Code Online (Sandbox Code Playgroud)

这将具有不调用任何不必要的构造函数的期望效果(即使它们可能被省略).


回答关于使"直接"语法工作的假设性问题:在一般情况下,任意map<K, V>,不.想象一下:

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

std::map<Proof, Proof> m;
m.emplace(1, 1, 1);  // Now what?
Run Code Online (Sandbox Code Playgroud)

你当然可以让它适用于有限的情况map<T, std::pair<T, T>>.借助大量高级模板技巧(想想SFINAE左,右,中,然后一些),它可能对一些更普遍的东西也是可行的.这是否值得,取决于您的具体情况.