我理解,或者至少有一个想法,为什么以下代码不起作用:
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
实例。由于没有引用但返回浅实例,编译失败。
那么,我该如何实现呢?
答案 0 :(得分:3)
问题是sb1 + sb2
的结果是暂时的;用于初始化sb3
的复制构造函数需要非const
引用;并且你不能对非临时的const
引用。
您几乎肯定希望通过将构造函数的参数类型更改为Spambar const &
来解决此问题。当你在这里时,你几乎肯定会对operator+
做同样的事情,同时也让操作员自己const
:
Spambar(Spambar const &);
Spambar operator + (Spambar const &) const;
如果你正在做一些非常奇怪的事情,并且实际上希望复制构造函数修改它的参数,那么你必须要么避免将临时值传递给它,要么对mutable
或{做一些讨厌的hackery {1}}。在C ++ 11中,您将使用参数类型为const_cast
的移动构造函数来处理此类事情。
答案 1 :(得分:2)
您的类没有使用const
引用的复制构造函数。通常,复制构造函数如下所示:
Spambar(const Spambar&);
您展示的表单仅在极少数情况下使用,可能会阻止您的代码正常工作。