Траблы с ссылками в агрументах перегруженных операторов и g++

Тема в разделе "LANGS.C", создана пользователем 10110111, 13 окт 2008.

  1. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    /*Edt: максимально упростил код при сохранении ошибки*/
    Есть код:

    Код (Text):
    1. class COMPLEX
    2. {
    3. public:
    4.     double x,y;
    5.     COMPLEX(double X,double Y)
    6.     {
    7.         x=X;
    8.         y=Y;
    9.     }
    10.     COMPLEX operator-(COMPLEX& z)
    11.     {
    12.         return COMPLEX(x-(z.x),y-(z.y));
    13.     }
    14. };
    15. int main()
    16. {
    17.     COMPLEX zz=COMPLEX(1.0,0)-COMPLEX(1,2);
    18.     COMPLEX a(1.0,0),b(1,2);
    19.     COMPLEX zzz=a-b;
    20.     return 0;
    21. }
    MSVC++ компилит без проблем.

    g++ же говорит:
    На zzz=a-b; не жалуется.
    При этом, если аргумент operator- заменить с COMPLEX& на COMPLEX, все нормально компилится.

    Почему так происходит?
    И какой компилятор прав в смысле стандарта?
     
  2. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Код (Text):
    1. COMPLEX zz=COMPLEX(1.0,0)-COMPLEX(1,2);
    ИМХО, и правильно что ругается на это выражение, имея вышеописанную вашу имплементацию класса COMPLEX.
    Код (Text):
    1. COMPLEX operator-(COMPLEX& z)
    2.     {
    3.         return COMPLEX(x-(z.x),y-(z.y));
    4.     }
    здесь правый операнд принимается по ссылке.
    при попытке вызвать
    Код (Text):
    1. COMPLEX zz=COMPLEX(1.0,0)-COMPLEX(1,2);
    второй операнд явл. автоматическим объектом, и его по ссылке нельзя передать.
    для этого нужно, если не ошибаюсь, передавать его по константной ссылке.
    попробуйте изменить реализацию оператора - в классе.
     
  3. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    прав g++

    временная переменная является rvalue. тогда как ссылка - lvalue.
    rvalue->lvalue запрещено.

    здесь все хорошо, т.к. b - lvalue
    какой MSVC? если 8.0 поставь флаг /Za и код перестанет компилироваться ;)
     
  4. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    Спасибо, вроде бы все понял. Поставил const COMPLEX& z и скомпилилось.