编译器不使用移动 c'tor / 赋值操作器?
Compiler not using move c'tor / assignment oper?
这个问题真的很简单。下面的示例代码中发生了什么导致它无法编译?
错误发生在main()
:的第一行
"使用已删除的函数'
std::__atomic0::...__atomic_base(...)
')"
#include <atomic>
#include <deque>
#include <vector>
using namespace std;
class Test {
public:
deque<atomic_int> dq;
Test(){}
};
int main(){
vector<Test> v = { Test(), Test() };
return 0;
}
我正在将其编译为c++0x代码,在其中我理解atomic
类型可能无法复制?但无论哪种方式,行vector<Test> v = { Test(), Test() };
都应该调用Test
的默认move构造函数/赋值运算符,该运算符应该调用Test::dq
的move构造器/赋值运算符来避免复制任何atomic_int
。
为什么不编译呢?
编辑
我的编译器将允许我将不可移动的对象添加到容器中,然后移动容器。见下文:
class Test {
public:
deque<atomic_int> dq;
Test(){
dq.resize(10);
}
};
int main(){
Test t1;
Test t2(std::move(t1));
return 0;
}
对t1
执行移动,它调用t1
的成员的移动,其中一个是deque
。因此,deque
中的每个成员都会发生移动,其中没有一个是atomic_int
由于C++11,只要不使用任何要求对象可复制或可移动的操作,那么只包含默认可构造对象的容器是完全合法的。
但是,std::initializer_list
只允许const
访问其元素,这意味着您不能从它们中移动。因此
vector<Test> v = { Test(), Test() };
将尝试复制Test
,这是无效的,因为它将尝试复制deque
。
相关文章:
- 为"adjacent"变量赋值时出现问题
- C++中的赋值发生,尽管右侧出现异常
- 用C++中的sscanf赋值
- 为std::string的某个索引赋值
- 重载Singly Linked List中的赋值运算符
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- gtest_使用setargpointee在函数中赋值
- 非常量变量只读位置的赋值
- 使用赋值运算符重载从类中返回jobject
- C++数据文件、数组和计算赋值
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 全局作用域中函数指针的赋值
- 错误:在为指针赋值时,void值没有被忽略
- 标准库类型的赋值运算符的引用限定符
- 关于 c++ 函数中指针赋值的简单问题
- 复制构造函数、赋值运算符C++
- 标准::变体的赋值运算符
- C++通用数据结构 - 数据字段赋值运算符与复制 C'Tor
- 编译器不使用移动 c'tor / 赋值操作器?
- 按值从函数返回对象并在赋值/复制 C'tor C++ 中使用它