Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.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++11 注释掉'move constructor'和'move assignment operator'会导致编译错误_C++11_Move Constructor_Move Assignment Operator - Fatal编程技术网

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