重载“++=”运算符:c++=a乘以b可以工作,但c++=a*b不能?

重载“++=”运算符:c++=a乘以b可以工作,但c++=a*b不能?,c++,operator-overloading,in-place,compound-assignment,C++,Operator Overloading,In Place,Compound Assignment,我有两个类别A和B。产品A*B应该是B型的。 由于类型B的变量将占用大量内存,因此我需要避免像B_1=B_1+A_1*B_2这样的操作,其中A_1*B_2将被临时分配。换句话说,我需要B_1+=A_1*B_2 我试过这个: struct A { int a; }; struct B { double b[size]; void operator += (pair<A*, B*> & lhsA_times_rhsB){ A &

我有两个类别A和B。产品A*B应该是B型的。 由于类型B的变量将占用大量内存,因此我需要避免像B_1=B_1+A_1*B_2这样的操作,其中A_1*B_2将被临时分配。换句话说,我需要B_1+=A_1*B_2

我试过这个:

struct A {
    int a;
};

struct B {
    double b[size];

    void operator += (pair<A*, B*> & lhsA_times_rhsB){
        A & lhsA = *lhsA_times_rhsB.first;
        B & rhsB = *lhsA_times_rhsB.second;

        b[lhsA.a] += rhsB.b[lhsA.a];
    }
};

inline pair<A*, B*> operator*( A& lhsA,  B& rhsB){
    return make_pair(&lhsA, &rhsB);
};

int main(){
    A A_in;
    B B_in, B_out;

    pair<A*, B*> product = A_in*B_in;

    B_out += product;    //this works!
    B_out += A_in*B_in;  //doesn't work!? (Compiler: "No viable overloaded '+='")

    return 0;
}
为什么B_out+=product可以,但B_out+=A_in*B_in不可以

有没有更好的方法来实现+=-运算符?可能不定义辅助对象对


问题是您正在创建一个临时对


*在这里,Clang的错误消息实际上没有那么有用,因为它被分成两部分。第一个是错误:没有可行的重载“+=”,第二个更具描述性:候选函数不可行:第一个参数需要一个l值。问题是您正在创建一个临时对


*在这里,Clang的错误消息实际上没有那么有用,因为它被分成两部分。第一个是错误:没有可行的重载“+=”,第二个更具描述性:候选函数不可行:第一个参数需要一个l值

错误消息非常清楚错误:无法将类型为“std::pair&”的非常量左值引用绑定到类型为“std::pair”*@NathanOliver我正在使用clang,这只给了我没有可行的重载“+=”和候选函数不可行:第一个参数需要一个l值。下次我还要征求gcc的意见:错误消息非常清楚错误:无法将类型为“std::pair&”的非常量左值引用绑定到类型为“std::pair”*@NathanOliver的右值,我使用的是clang,它只给了我没有可行的重载“+=”和候选函数不可行:第一个参数需要一个l值。下次我也会征求gcc的意见:
 void operator += (pair<A*, B*> & lhsA_times_rhsB)
void operator += (const pair<A*, B*>& lhsA_times_rhsB)