【发布时间】:2020-07-30 20:18:31
【问题描述】:
我有一个班级NoCopy,可移动,但不可复制。
我需要制作一个 NoCopy 的 3 个队列的向量。我可以创建一个空的,但是没有办法添加任何元素。
我可以创建一个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::vector<QNC> qvec(3); qvec[0].swap(q); qvec[1].push(NoCopy()); -
问题似乎是vector需要noexcept移动语义,而std::queue不会从底层值传播自己的移动语义'noexcept-ness
-
@SamVarshavchik Ditto. this workaround 合法吗?
-
可以使用ncvec.emplace_back(q),emplace_back()使用移动语义。
-
@SamVarshavchik:它确实传播了这一点,但这还不够好;我写了一个答案。
标签: c++ containers movable