2013 C++ Portable | EXTENDED 2025 |

std::for_each(v.begin(), v.end(), [](int x) { std::cout << x * 2 << "\n"; }); Smart pointers ( unique_ptr , shared_ptr ) moved from "Boost-only magic" to standard-issue memory safety. Raw new and delete started looking like exposed wiring in a modern home. But let’s not rewrite history. C++ in 2013 still had teeth—and fangs. Move semantics were powerful, but the rules for when a move happens vs. a copy were arcane enough to require a PhD in "value category theology" (lvalues, rvalues, xvalues, glvalues, prvalues... shudder ).

auto it = my_map.find(key); // The angels sang. Range-based for loops? We had them. Lambda expressions? Oh yes—and they could capture [this] , [=] , [&] , or your entire will to live. 2013 c++

Foo f1(); // Most vexing parse: it's a function declaration. Foo f2{}; // Ah, uniform initialization. Unless it isn't. And compile times? You could brew coffee, drink it, and contemplate your life choices while #include <boost/spirit/> did its dark magic. std::string didn’t have starts_with() or ends_with() . You rolled your own or used .find() == 0 like a savage. std::regex was in the standard—but its performance was so tragically slow that many shops banned it in hot paths. std::for_each(v