直接放置在 std::map 对中
Emplace directly in std::map of pair
为什么这段代码无法编译?
std::map<int,std::pair<int,int>> m;
m.emplace(1,1,1);
假设我们可以编辑 std::map::emplace
的代码,是否可以更改它以使之前的代码有效?
无效的原因与此无效的原因完全相同:
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)
);
这将产生不调用任何不必要的构造函数的预期效果(即使它们可能会被省略)。
回答关于使 "direct" 语法起作用的假设性问题:在一般情况下,对于任意 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 左,右和中心,然后一些).这是否值得取决于您的具体情况。
为什么这段代码无法编译?
std::map<int,std::pair<int,int>> m;
m.emplace(1,1,1);
假设我们可以编辑 std::map::emplace
的代码,是否可以更改它以使之前的代码有效?
无效的原因与此无效的原因完全相同:
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)
);
这将产生不调用任何不必要的构造函数的预期效果(即使它们可能会被省略)。
回答关于使 "direct" 语法起作用的假设性问题:在一般情况下,对于任意 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 左,右和中心,然后一些).这是否值得取决于您的具体情况。