gpt4 book ai didi

c++ - 嵌套可移动对象的 std::containers

转载 作者:行者123 更新时间:2023-12-01 13:40:40 30 4
gpt4 key购买 nike

我有一个类NoCopy可移动 ,但是 不可复制 .

我需要做一个 NoCopy的3个队列的 vector .我可以创建一个空的,但无法添加任何元素。

我可以做一个 std::vector<NoCopy>std::queue<NoCopy>并填充它们。但不适用于 std::vector<std::queue<NoCopy>> .

MWE:

#include <iostream>
#include <vector>
#include <queue>

class NoCopy{
public:
NoCopy() = default;
NoCopy& operator = (const NoCopy&) = delete;
NoCopy(const NoCopy&) = delete;

NoCopy(NoCopy&&) = default;
NoCopy& operator = (NoCopy&&) = default;

};
using QNC = std::queue<NoCopy>;

int main(void) {
QNC q;
q.push(std::move(NoCopy()));

std::vector<NoCopy> ncvec;
ncvec.emplace_back();

std::cout << "Queue size " << q.size() << ", vector size: " << ncvec.size() << std::endl;

std::vector<QNC> qvec;
//????

return 0;
}

有任何想法吗?

最佳答案

默认情况下,std::queue基于 std::deque ,不保证是 nothrow-movable .其他合适的标准容器也不是,std::list ;这些规则允许始终分配至少一个节点/块的实现。 std::vector除非类型根本不可复制,否则在移动时使用拷贝重新分配可能会抛出(以保证异常安全),并且这两个容器也不会传播 不可复制性 从他们的元素类型,但如果你尝试就会失败。最后一个可以说是标准中的一个缺陷,因为对这种传播的期望不断提高,但修复它与支持不完整类型不兼容:

struct Node {
std::vector<Node> children;
// …
};

请注意,libstdc++ 和 libc++ 使这两个容器不可移动(在每种情况下从版本 9 开始),这是允许的扩展,但 MSVC 的 STL 没有。

您仍然可以使用 std::vector<QNC> v(3); ;构造函数“知道” 回复 永远不需要分配。或者您可以提供一个 wrapper (例如,从 std::queue 派生的类)不可复制或不可移动;前者将放弃 std::vector 的异常安全,而后者将调用 std::terminate如果移动底层容器确实抛出。

关于c++ - 嵌套可移动对象的 std::containers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61269785/

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