C++ 编译器不使用move c';任务/任务操作?
这个问题真的很简单。下面的示例代码中发生了什么导致它无法编译 错误发生在C++ 编译器不使用move c';任务/任务操作?,c++,move-semantics,C++,Move Semantics,这个问题真的很简单。下面的示例代码中发生了什么导致它无法编译 错误发生在main()的第一行: “使用已删除的函数“std::_原子0::…_原子基(…)”) 移动在t1上执行,这将调用t1成员的移动,其中一个成员是deque。因此,deque中的每个成员都会发生移动,其中没有一个属于atomic\u int类型,因为C++11,只有默认可构造对象的容器是完全合法的,只要您不使用任何要求对象可复制或可移动的操作 但是,std::initializer\u list只允许const访问其元素,这意
main()
的第一行:
“使用已删除的函数“std::_原子0::…_原子基(…)
”)
移动在
t1
上执行,这将调用t1
成员的移动,其中一个成员是deque
。因此,deque
中的每个成员都会发生移动,其中没有一个属于atomic\u int
类型,因为C++11,只有默认可构造对象的容器是完全合法的,只要您不使用任何要求对象可复制或可移动的操作
但是,std::initializer\u list
只允许const
访问其元素,这意味着您不能从元素中移动。因此
vector<Test> v = { Test(), Test() };
向量v={Test(),Test()};
将尝试复制一个
测试
,这是无效的,因为它将尝试复制原子的deque
deque没有意义。请详细说明为什么deque
没有意义?@和YMCOY我猜是标准(容器)作者没有考虑类型是可分配但不可复制的情况。或者他们明确排除了这些类型。@AndyMcoy另一件事,移动构造函数直到C++11才出现在标准中,所以可能您的编译器正在做一些非标准的事情?因为deque不是原子的,所以在其中放入原子类型是没有意义的,您需要锁定deque本身。这是否意味着,即使在C++11之后,如果确实向后推,也不允许使用vector
?无法复制
类型的对象,因此vector
是非法的,无论您如何使用vector,因为向量类将要求在向量增长并在内存中传播时将现有元素复制到新的内存位置。@AndyMcoy只有在我导致向量重新分配时,对吗?或者,至少,我认为可以这样实现。因为C++11:“对元素施加的要求取决于在容器上执行的实际操作。一般来说,要求元素类型是完整类型并满足可擦除的要求,但许多成员函数施加更严格的要求。”因此,我想这实际上取决于STD::在C++ STD库中实现向量。@ AndyMcoy可以做一个代码>向量f(10);编码>,然后在其上调用pop_back()
或clear()
。就这样。
class Test {
public:
deque<atomic_int> dq;
Test(){
dq.resize(10);
}
};
int main(){
Test t1;
Test t2(std::move(t1));
return 0;
}
vector<Test> v = { Test(), Test() };