并非所有类型的移动都比复制更有效,对于某些类型,甚至显式禁用复制和移动可能是有意义的。考虑std::array<int, BIGNUM>
作为前一种类型的示例。
重点是emplace
功能和piecewise_construct
是可以构造这样一个类in place,无需创建要移动或复制的临时实例。
struct big {
int data[100];
big(int first, int second) : data{first, second} {
// the rest of the array is presumably filled somehow as well
}
};
std::pair<big, big> pair(piecewise_construct, {1,2}, {3,4});
比较以上pair(big(1,2), big(3,4))
其中两个临时big
必须创建对象然后复制 - 而移动在这里根本没有帮助!相似地:
std::vector<big> vec;
vec.emplace_back(1,2);
分段构造一对的主要用例是将元素放入map
or an unordered_map
:
std::map<int, big> map;
map.emplace(std::piecewise_construct, /*key*/1, /*value*/{2,3});