Присваивание C ++ при приведении типа

Сегодня я наткнулся на нечто подобное, а затем попробовал несколько вещей и заметил, что следующее кажется допустимым в 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 , как и следовало ожидать).

Итак, я интересно, это неопределенное поведение ? Если это так, то что именно делает его так? Если нет, то каковы будут преимущества такого кода?

5
задан netcoder 20 December 2011 в 02:00
поделиться