移动构造函数(错误:调用隐式删除的复制构造函数)

时间:2013-10-17 21:56:49

标签: c++ std clang++

我第一次使用移动构造函数和移动赋值运算符进行实验,但是当我使用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;
}

2 个答案:

答案 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可以使用它。