Приведение этого указателя к производному классу в CRTP - PullRequest
0 голосов
/ 27 мая 2020

Интересно, хорошо ли определен этот код. Мне кажется, все в порядке, но, надеюсь, кто-нибудь сможет объяснить это (правильно или неправильно) стандартными терминами.

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 вызвать проблему?

...