void foo() {
std::vector v = {0, 1, 2, 4};
const auto& ref = v[1];
add_missing_values(v);
std::cout << ref << "\n";
}
void add_missing_values(std::vector<int>& v) {
// ...
v.push_back(3);
}
Neither foo(), nor add_missing_values() looks suspicious. Nonetheless, if v.push_back(3) requires v to grow, then ref becomes an invalid reference and std::cout << ref becomes UB (use after free). In Rust this would not compiles.
It is order of magnitudes easier to have lifetime errors in C++ than in Rust (use after free, double free, data races, use before initialisation, …)