Баг компилятора. Не учитывает константность возвращаемого значения в операторах.

 

Билд 1966, 64 бита.  Компилятор не учитывает константность возвращаемого значения в операторах.

struct A
{
  char _a;
  
  A()         {  }
  A(const A&) {  }
  
  const A operator=(const A&) { return this; }
  
  const A f() { return this; }
};


void OnInit()
{
  A a;
  (a=a)=a; // Нет ошибки компиляции!
  
  a.f()=a; // Есть ошибка, как положено:  constant cannot be modified 
}
 

Здесь нет ошибки.

Сначала идет присвоение неконстантной переменной a.

И уже для неё вызывается второй operator=.

Если хотите проверить корректно, напишите так:

a.operator=( a ) = a;
 
Koldun Zloy:

Здесь нет ошибки.

Сначала идет присвоение неконстантной переменной a.

И уже для неё вызывается второй operator=.

Вы что-то путаете.  Проверьте как оно работает в C++.  Второе присвоение относится к результату первой функции, а не к переменной.
 
Проверил. Вы правы.
 
Alexey Navoykov:

Билд 1966, 64 бита.  Компилятор не учитывает константность возвращаемого значения в операторах.

Спасибо за сообщение.

Исправил, теперь учитывается константность результата для вызова оператора.

Причина обращения: