【问题标题】:error: call to implicitly-deleted copy constructor of 'Cadena'错误:调用“Cadena”的隐式删除的复制构造函数
【发布时间】:2014-05-08 18:07:58
【问题描述】:

当我尝试编译我的代码时,我遇到了下一个错误:

./usuario.h:64:37: error: call to implicitly-deleted copy constructor of 'Cadena'
                Cadena direccion() const { return direccion_; }
                                                  ^~~~~~~~~~
./../P1/Cadena/cadena.h:11:3: note: copy constructor is implicitly deleted because 'Cadena' has a user-declared move constructor
                Cadena(Cadena&& c);
usuario.cpp:14:3: error: call to implicitly-deleted copy constructor of 'Cadena'
         nombre_(nombre), apellidos_(apellidos), direccion_(direccion), password_(password){
         ^       ~~~~~~

Cadena 中的构造函数有:

Cadena(const size_t t=0, const char c=' ');
Cadena(Cadena&& c);
Cadena(const char* c);

还有移动构造函数:

Cadena::Cadena(Cadena&& c) : tam_(c.tam_) {
    cadena_ = new char[tam_+1];
    strcpy(cadena_, c.cadena_);    
    c.tam_=0;
    delete[] c.cadena_;
    c.cadena_ = new char[1];
    c.cadena_ = "";
}

usuario.h 中的声明是:

//........
public:
     Cadena id() const { return id_; }
//....
private:
     Cadena direccion_;

Cadena 类运行良好,但现在我需要使用它,编译器会删除这些错误。 我认为我没有做任何特别的事情,只返回/分配一个 Cadena 类型的对象..

我期待你的反馈,

最好的问候。

【问题讨论】:

  • 那条错误信息说明了一切,您遇到了什么问题?您正在尝试返回 Cadena 的副本,由于错误消息中解释的原因,这是不可能的。也许您还需要提供一个复制构造函数,或者明确地默认一个?
  • 实际上,我删除了复制构造函数,我相信移动构造函数与复制具有相同的功能。谢谢!
  • 不,复制和移动是两个截然不同的操作,复制时需要复制构造函数。您可以通过将违规行更改为 Cadena direccion() const { return std::move(direccion_); } 来修复您的代码,但这可能不是您想要的行为。
  • 非常感谢,这就是我想要的

标签: c++ c++11 move-constructor


【解决方案1】:

为了完整起见,标准要求编译器警告中的行为:

12.8 复制和移动类对象 [class.copy]

7 如果类定义没有显式声明一个副本 构造函数,一个是隐式声明的。 如果类定义 声明一个移动构造函数或移动赋值运算符, 隐式声明的复制构造函数被定义为已删除; 否则, 它被定义为默认值(8.4)。后一种情况被弃用,如果 类具有用户声明的复制赋值运算符或用户声明的 析构函数。

因此,如果您想要复制行为,则必须自己提供复制构造函数和复制赋值运算符。

但是,查看您的移动构造函数,它似乎不提供任何移动语义,而是提供深度复制(提示:strcopy() 做什么?它肯定不会移动)。因此,我会将您当前的移动构造函数重命名为复制构造函数,并提供一个实际移动的新移动构造函数(即重新分配 char 指针或您类中实际数据的句柄)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 2013-11-02
    • 2016-09-11
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    相关资源
    最近更新 更多