Сегодня я наткнулся на нечто подобное, а затем попробовал несколько вещей и заметил, что следующее кажется допустимым в G ++:
struct A {
int val_;
A() { }
A(int val) : val_(val) { }
const A& operator=(int val) { val_ = val; return *this; }
int get() { return val_; }
};
struct B : public A {
A getA() { return (((A)*this) = 20); } // legal?
};
int main() {
A a = 10;
B b;
A c = b.getA();
}
Итак B :: getB
возвращает тип A
, после которого ему присвоено значение 20
(через перегруженный A :: operator =
).
После нескольких тестов кажется, что он возвращает правильное значение ( c.get
вернет 20
, как и следовало ожидать).
Итак, я интересно, это неопределенное поведение ? Если это так, то что именно делает его так? Если нет, то каковы будут преимущества такого кода?