Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译器不使用move c';任务/任务操作?_C++_Move Semantics - Fatal编程技术网

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