C++11 注释掉'move constructor'和'move assignment operator'会导致编译错误
我从中获取了以下代码。我想查看带有/不带C++11 注释掉'move constructor'和'move assignment operator'会导致编译错误,c++11,move-constructor,move-assignment-operator,C++11,Move Constructor,Move Assignment Operator,我从中获取了以下代码。我想查看带有/不带移动构造函数和移动赋值运算符的输出。原始代码编译得很好。但如果我注释掉这两种方法的实现,它将无法编译,并出现错误: move-1.cpp: In instantiation of ‘Buffer<T>& Buffer<T>::operator=(const Buffer<T>&) [with T = int]’: move-1.cpp:90:6: required from here move-1.c
移动构造函数
和移动赋值运算符
的输出。原始代码编译得很好。但如果我注释掉这两种方法的实现,它将无法编译,并出现错误:
move-1.cpp: In instantiation of ‘Buffer<T>& Buffer<T>::operator=(const Buffer<T>&) [with T = int]’:
move-1.cpp:90:6: required from here
move-1.cpp:40:17: error: no match for ‘operator=’ (operand types are ‘std::unique_ptr<int [], std::default_delete<int []> >’ and ‘int*’)
_buffer = _size > 0 ? new T[_size] : nullptr;
在
main
中,调用以下构造函数/赋值运算符:
Buffer<int> b1; // default constructor
Buffer<int> b2("buf2", 64); // constructor
Buffer<int> b3 = b2; // copy constructor
Buffer<int> b4 = getBuffer<int>("buf4"); // move constructor
b1 = getBuffer<int>("buf5"); // move assignment operator
为了在包含移动构造函数的情况下捕捉到这一点,我将在main
中添加一个新的测试,该测试将强制使用复制赋值操作符,如:
// ...
b1 = getBuffer<int>("buf5"); // move assignment operator
b2 = b3; // copy assignment operator
/。。。
b1=getBuffer(“buf5”);//移动赋值运算符
b2=b3;//复制赋值运算符
在main
中,调用以下构造函数/赋值运算符:
Buffer<int> b1; // default constructor
Buffer<int> b2("buf2", 64); // constructor
Buffer<int> b3 = b2; // copy constructor
Buffer<int> b4 = getBuffer<int>("buf4"); // move constructor
b1 = getBuffer<int>("buf5"); // move assignment operator
为了在包含移动构造函数的情况下捕捉到这一点,我将在main
中添加一个新的测试,该测试将强制使用复制赋值操作符,如:
// ...
b1 = getBuffer<int>("buf5"); // move assignment operator
b2 = b3; // copy assignment operator
/。。。
b1=getBuffer(“buf5”);//移动赋值运算符
b2=b3;//复制赋值运算符
我有点好奇:即使复制赋值操作符
没有被调用,它仍然会被编译。为什么编译器不抱怨如果我保留这两个move
方法?@duong_dajgja这是因为Buffer
是一个模板类;由于没有人调用复制赋值运算符,因此该函数从未实例化。将检查函数定义的有效语法和其他一些内容,但不会检查以某种方式依赖于T
的任何检查。(例如,因为有人可以添加一个模板专门化来更改\u buffer
的类型。)我不确定这种行为通常被称为什么。请注意,您可以通过添加类似模板缓冲区&buffer::operator=(const buffer&)的行来强制实例化复制分配运算符
我有点好奇:即使没有调用复制赋值操作符
,它仍然会被编译。为什么编译器不抱怨如果我保留这两个move
方法?@duong_dajgja这是因为Buffer
是一个模板类;由于没有人调用复制赋值运算符,因此该函数从未实例化。将检查函数定义的有效语法和其他一些内容,但不会检查以某种方式依赖于T
的任何检查。(例如,因为有人可以添加一个模板专门化来更改\u buffer
的类型。)我不确定这种行为通常被称为什么。请注意,您可以通过添加类似模板缓冲区&buffer::operator=(const buffer&)的行来强制实例化复制分配运算符代码>
// ...
b1 = getBuffer<int>("buf5"); // move assignment operator
b2 = b3; // copy assignment operator