As I understand it, one cannot change the reference variable once it has been initialized. See, for instance, this question. However, here is a minmal working example which sort of does reassign it. What am I misunderstanding? Why does the example print both 42 and 43?
#include <iostream>
class T {
    int x;
public:
    T(int xx) : x(xx) {}
    friend std::ostream &operator<<(std::ostream &dst, T &t) {
        dst << t.x;
        return dst;
    }
};
int main() {
    auto t = T(42);
    auto q = T(43);
    auto &ref = t;
    std::cerr << ref << std::endl;
    ref = q;
    std::cerr << ref << std::endl;
    return 0;
}
 
     
     
    