为什么在添加其他构造函数时会出现此错误?

Kac*_*acy 0 c++ constructor compiler-errors

一旦我知道这个主题属于什么主题,我会很乐意将这个主题的标题更改为更合适的内容.

如果我更改了导致错误的构造函数的参数,则没有错误.

如果我包含那个确切的构造函数,则只会出现此错误:

error: no matching function for call to 'Object::Object(Object)'
note: candidates are: Object::Object(Object&)
note:                 Object::Object()
Run Code Online (Sandbox Code Playgroud)

码:

#include <iostream>

using namespace std;

class Object {

  public:

    Object() {}     /* default constructor - no problems at all */

    Object( Object & toCopy ) {}  /* Cause of error, but no error when commented out */

    Object func() {  
      Object obj;
      return obj;
    }

};

int main() {

  Object o = o.func();  /* this is the line that the error is actually on */

  return 0;

}
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 6

你已经声明了一个不寻常和可怕的复制构造函数,即通过非常量引用获取参数的复制构造函数.这是可能的,这意味着不会隐式定义其他复制构造函数.但是,这也意味着您无法从临时值构造副本,因为它们不会绑定到非常量引用.

除非你有理由做你正在做的事情(也许你想定义auto_obj:-)?),你应该用参数声明通常的复制构造函数Object const &(但一定要正确定义它!),或者只是完全不做它依赖于隐式生成的版本(当您在代码中"注释掉"行时); 或者在C++ 11中,您可以通过声明来默认复制构造函数Object(Object const &) = default;.

(请注意,流行的Rule of Three表示你不应该定义自己的,非平凡的复制构造函数,或者如果你这样做,那么你还需要一个用户定义的析构函数和赋值运算符.确保你的代码是理智的. )

  • @computer:怎么样? (2认同)
  • @KacyRaye:欣赏你的意思,但非const-reference拷贝构造函数*非常糟糕.它大量混淆,几乎完全在语义上被误导.你可以让`auto_ptr`和20年的开发人员成为这个的见证人. (2认同)