When I learned C++, there was no auto. Range-based for loops didn't exist. The combination of those two were particularly nice because instead of writing:
for(std::vector<sometype<int>>::const_iterator it = my_container.cbegin(); it != my_container.cend(); ++it){
// use *it
}
You could use:
for(auto const& val : my_container) {
// use val
}
Which really paved the way for less hesitation around nesting templates and other awkward things.
Same goes for map with the introduction of structured bindings:
for(std::map<somekey, sometype<int>>::const_iterator it = my_map.cbegin(); it != my_map.cend(); ++it){
// use it->first, it->second
}
became
for(auto const& [key, val] : my_map) {
// use key, val
}
The introduction of std::variant made state a lot easier to reason about. Unions meant too much room for error, and cramming polymorphism into places it shouldn't have ever been was riddled with its own performance and memory issues.
std::optional was also a game changer in that regard.
constexpr was huge. It killed off a bunch of awkward template metaprogramming for something faster to compile and easier to deal with. I wasn't a part of the consteval discussions but from what I HEARD people say about it and what it actually WAS, I think it was castrated at some point along the way.
Concepts, also a big one.
Formatting (RIP iostreams) is much nicer than the alternative.
Ranges, coroutines, modules - they'll have their day too.
And we have a bunch of stuff to look forward to. Senders and receivers solves a lot of component interaction problems. Reflection will rid us of so much annoying provisioning of classes. Pattern matching and expression statements will be major usability boosts.
Ok, C++ doesn't move at the speed of newer languages, but for its size, complexity and all of the hurdles that it has on the way to standardisation, I think modernisations are many and often successful.
I would absolutely love a major break that fixed things we can't currently fix due to ABI risks, implementer resistance, etc. I'd love to rid us of the old ways™ and focus on safety the right way™ - by removing bad bits rather than just adding good bits and telling people to use them and follow a bunch of guidelines. I'd love better defaults.
There is so much work to do to make C++ great again puts on MCPPGA hat, but I can't agree that modernisation are few and rarely successful.