0

我理解或至少知道为什么以下代码不起作用:

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实例的引用。由于没有引用但返回浅实例,因此编译失败。

那么,我该如何让它发挥作用呢?

4

2 回答 2

3

问题是结果sb1 + sb2是暂时的;用于初始化的复制构造函数sb3需要非const引用;并且您不能const对临时文件进行非引用。

您几乎肯定想通过将构造函数的参数类型更改为Spambar const &. 当您使用它时,您几乎可以肯定地对 执行相同operator+的操作,并且还使操作员本身const

Spambar(Spambar const &);
Spambar operator + (Spambar const &) const;

mutable如果您正在做一些非常奇怪的事情,并且实际上希望复制构造函数修改其参数,那么您将不得不避免将临时变量传递给它,或者使用or做一些令人讨厌的黑客行为const_cast。在 C++11 中,您将使用带有参数 type 的移动构造函数Spambar &&来处理这类事情。

于 2012-04-13T16:22:21.677 回答
2

您的类没有const引用的复制构造函数。通常,复制构造函数如下所示:

Spambar(const Spambar&);

您显示的表单仅在极少数情况下使用,它可能会阻止您的代码工作。

于 2012-04-13T16:11:32.347 回答