C++11 对和元组的piecewise_construct 用例?

2023-12-20

In N3059 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3059.pdf我找到了描述分段构造对(和元组)(它在新标准中)。

但我不知道什么时候应该使用它。我发现有关的讨论emplace和不可复制的实体,但是当我尝试时,我无法创建一个案例need piecewiese_construct或者可以看到性能优势。

例子。我想我需要一堂课不可复制, but movebale(转发时需要):

struct NoCopy {
  NoCopy(int, int) {};
  NoCopy(const NoCopy&) = delete; // no copy
  NoCopy& operator=(const NoCopy&) = delete; // no assign
  NoCopy(NoCopy&&) {}; // please move
  NoCopy& operator=(NoCopy&&) {}; // please move-assign
};

然后我有点预期标准的配对构造会失败:

pair<NoCopy,NoCopy> x{ NoCopy{1,2}, NoCopy{2,3} }; // fine!

但事实并非如此。实际上,这正是我所期望的,因为“移动东西”而不是在 stdlib 中的任何地方复制它,这是应该的。

因此,我看不出为什么我应该这样做,或者这样:

pair<NoCopy,NoCopy> y(
    piecewise_construct,
    forward_as_tuple(1,2),
    forward_as_tuple(2,3)
); // also fine
  • 那么,什么是usecase?
  • 如何以及何时我用吗piecewise_construct?

并非所有类型的移动都比复制更有效,对于某些类型,甚至显式禁用复制和移动可能是有意义的。考虑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});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++11 对和元组的piecewise_construct 用例? 的相关文章

随机推荐