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 回答