gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:30:10 25 4
gpt4 key购买 nike

N3059我找到了 的描述分段构造对(和元组)(它在新标准中)。

但是我看不出什么时候应该使用它。我找到了关于 emplace 和不可复制实体的讨论,但是当我尝试时,我无法创建需要的案例 piecewiese_construct或者可以看到性能优势。

例子。我想我需要一个不可复制但可移动的类(转发所需):

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
  • 那么,什么是 用例 ?
  • 如何以及何时 我是否使用 piecewise_construct ?
  • 最佳答案

    并非所有类型都可以比复制更有效地移动,对于某些类型,甚至明确禁用复制和移动可能是有意义的。考虑 std::array<int, BIGNUM>作为前一种类型的一个例子。

    点与emplace函数和 piecewise_construct是这样的类可以就地构造,而无需创建要移动或复制的临时实例。

    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);

    分段构造一对的主要用例是将元素放入 mapunordered_map :
    std::map<int, big> map;
    map.emplace(std::piecewise_construct, /*key*/1, /*value*/{2,3});

    关于对和元组的piecewise_construct 的C++11 用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6162201/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com