我了解以下代码为何不起作用,或者至少有一个主意:

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;


如果您正在做一些非常奇怪的事情,并且实际上想要复制构造函数修改其参数,那么您将不得不避免将临时变量传递给它,或者使用mutableconst_cast进行一些讨厌的黑客攻击。在C ++ 11中,您将使用参数类型为Spambar &&的move构造函数来进行此类操作。

09-04 17:24