我了解以下代码为何不起作用,或者至少有一个主意:
class Spambar {
public:
Spambar() {};
Spambar(Spambar& sb) {};
Spambar operator + (Spambar sb) {
Spambar new_sb;
return new_sb;
}
};
int main() {
Spambar sb1;
Spambar sb2;
Spambar sb3 = sb1 + sb2; // <<< Error: "No matching function for call to ... "
}
我猜,问题在于复制构造函数期望引用
Spambar
实例。由于没有引用,但返回了浅表实例,因此编译失败。那么,我该如何工作呢?
最佳答案
问题是sb1 + sb2
的结果是临时的;用于初始化sb3
的复制构造函数需要一个非const
引用;并且您不能将非const
引用用作临时引用。
您几乎肯定要通过将构造函数的参数类型更改为Spambar const &
来解决此问题。在使用它时,几乎应该确定对operator+
进行相同的操作,并使操作员本身成为const
:
Spambar(Spambar const &);
Spambar operator + (Spambar const &) const;
如果您正在做一些非常奇怪的事情,并且实际上想要复制构造函数修改其参数,那么您将不得不避免将临时变量传递给它,或者使用
mutable
或const_cast
进行一些讨厌的黑客攻击。在C ++ 11中,您将使用参数类型为Spambar &&
的move构造函数来进行此类操作。