Systems programmers who want speed without sacrificing sanity. Game devs tired of manual memory management. Embedded engineers who just discovered constexpr . And nostalgic millennials who remember when std::make_unique finally arrived in 2013 (yes, it was added via a defect report).
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 ).
JavaScript developers who faint at the sight of && or :: . Or anyone who thinks Python’s GIL is "not that bad." Final note: If you're writing C++ today (C++20/23), thank 2013. That was the year the committee stopped polishing the deck chairs on the Titanic and started rebuilding the ship. 2013 c++
Multithreading? C++11 gave us std::thread , std::mutex , and std::atomic . But in 2013, writing correct lock-free code still required sacrificing a goat to Herb Sutter. 2013 C++ was the turning point. It was no longer just "C with classes and footguns." It was a language that admitted: maybe compile-time computation (constexpr), functional patterns (lambdas), and deterministic RAII could coexist.
Review by a recovering C++98 programmer
It was ugly in places. It was over-engineered in others. But for the first time in over a decade, C++ felt alive .
⭐⭐⭐⭐ (one star removed for template error messages longer than War and Peace ) But let’s not rewrite history
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.