Интересно, хорошо ли определен этот код. Мне кажется, все в порядке, но, надеюсь, кто-нибудь сможет объяснить это (правильно или неправильно) стандартными терминами.
template <typename T>
class B {
public:
B (int n) : p {n} {}
T& operator++ () {
++p;
return static_cast<T&> (*this); // (X)
}
int p;
};
class Z : public B<Z> {
public:
using B::B;
int boo = 42;
};
и использование:
Z z {10};
std::cout << z.p << " " << z.boo << "\n";
Z& x = ++z;
std::cout << x.p << " " << x.boo << "\n";
x.boo = 1;
++x;
std::cout << z.p << " " << z.boo << "\n";
Что люди всегда делают, так это иметь ссылку на базовый класс и передать ему производный объект. Здесь у меня противоположное поведение в (X). Результат использования такой, как ожидалось. Я спрашиваю, может ли расширение Z вызвать проблему?