/*Edt: максимально упростил код при сохранении ошибки*/ Есть код: Код (Text): class COMPLEX { public: double x,y; COMPLEX(double X,double Y) { x=X; y=Y; } COMPLEX operator-(COMPLEX& z) { return COMPLEX(x-(z.x),y-(z.y)); } }; int main() { COMPLEX zz=COMPLEX(1.0,0)-COMPLEX(1,2); COMPLEX a(1.0,0),b(1,2); COMPLEX zzz=a-b; return 0; } MSVC++ компилит без проблем. g++ же говорит: На zzz=a-b; не жалуется. При этом, если аргумент operator- заменить с COMPLEX& на COMPLEX, все нормально компилится. Почему так происходит? И какой компилятор прав в смысле стандарта?
Код (Text): COMPLEX zz=COMPLEX(1.0,0)-COMPLEX(1,2); ИМХО, и правильно что ругается на это выражение, имея вышеописанную вашу имплементацию класса COMPLEX. Код (Text): COMPLEX operator-(COMPLEX& z) { return COMPLEX(x-(z.x),y-(z.y)); } здесь правый операнд принимается по ссылке. при попытке вызвать Код (Text): COMPLEX zz=COMPLEX(1.0,0)-COMPLEX(1,2); второй операнд явл. автоматическим объектом, и его по ссылке нельзя передать. для этого нужно, если не ошибаюсь, передавать его по константной ссылке. попробуйте изменить реализацию оператора - в классе.
прав g++ временная переменная является rvalue. тогда как ссылка - lvalue. rvalue->lvalue запрещено. здесь все хорошо, т.к. b - lvalue какой MSVC? если 8.0 поставь флаг /Za и код перестанет компилироваться