我第一次使用移动构造函数和移动赋值运算符进行实验,但是当我使用clang ++进行编译时:
c++ -o image -O3 image.cpp -std=c++0x -stdlib=libc++
我收到以下错误消息:
image.cpp:125:11: error: call to implicitly-deleted copy constructor of 'Image'
Image res = sample;
我真的不明白这意味着什么以及如何解决这个问题?我复制了整个代码。任何帮助将不胜感激。
PS:我在网上找不到有关此错误消息的任何内容(除了2011/2012的一些帖子,相对于clang ++中的一个错误,我相信当时已经修复过了。)
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <fstream>
#include <cassert>
class Image
{
public:
Image() : w(512), h(512), d(NULL)
{
//printf("constructor default\n");
d = new float[w * h * 3];
memset(d, 0x0, sizeof(float) * w * h * 3);
}
Image(const unsigned int &_w, const unsigned int &_h) : w(_w), h(_h), d(NULL)
{
d = new float[w * h * 3];
memset(d, 0x0, sizeof(float) * w * h * 3);
}
// move constructor
Image(Image &&img) : w(0), h(0), d(NULL)
{
w = img.w;
h = img.h;
d = img.d;
img.d = NULL;
img.w = img.h = 0;
}
// move assignment operator
Image& operator = (Image &&img)
{
if (this != &img) {
if (d != NULL) delete [] d;
w = img.w, h = img.h;
d = img.d;
img.d = NULL;
img.w = img.h = 0;
}
return *this;
}
//~Image() { if (d != NULL) delete [] d; }
unsigned int w, h;
float *d;
};
int main(int argc, char **argv)
{
Image sample;// = readPPM("./lean.ppm");
Image res = sample;
return 0;
}
答案 0 :(得分:2)
根据C ++标准
如果类定义声明了移动构造函数或移动赋值 运算符,隐式声明的复制构造函数定义为 删除;否则,它被定义为默认
您的示例将起作用尝试以下
Image res = std::move( sample );
答案 1 :(得分:1)
正如消息所说 - 图像类没有复制构造函数。所以你可以实现一个,或者你的意图是测试移动构造函数试试这个:
int main(int argc, char **argv)
{
Image sample;// = readPPM("./lean.ppm");
Image res = std::move(sample);
return 0;
}
std::move
会将sample
转换为r值引用,以便move-constructor / move-assignment可以使用它。