为什么这段代码不会编译?
std::map<int,std::pair<int,int>> m;
m.emplace(1,1,1);
假设我们可以编辑std::map::emplace
的代码,是否可以更改它以使之前的代码有效?
答案 0 :(得分:8)
无效的原因完全相同:
std::pair<const int, std::pair<int, int>> p{1, 1, 1};
因为上面的内容实际上是地图的emplace
归结为什么。
为了使其有效,您可以使用http://ip.ip.ip.ip/home/,这是为了这个目的而引入的:
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>>
的有限情况。借助大量大量的高级模板技巧(想想piecewise_construct
constructor of std::pair
左,右,中,然后一些),它可能对一些更通用的东西也是可行的。这是否值得,取决于你的具体情况。