http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
Another Stroustrup property.
His "C++ Principles and Practice" are particularly relevant to your question.
Herb Sutter's works are likewise good choices.
"Effective Modern C++" and related works by Scott Meyers are good choices.
Many works by Andrei Alexandrescu are worth reading.
Josuttis "The C++ Standard Library - A Tutorial and Reference" is worthy of some time.
Many of the Boost libraries are also good to examine (and use). After all, from Boost came shared_ptr. Stroustrup has some caution about Boost. Alexandrescu's text from about 2001 issues some warnings about the design of shared_ptr (though it doesn't mention it specifically - he favored policy design in his smart pointers, and prohibited any member functions as they can confuse the consumers of the smart pointer).
I'm a 50 something developer, where C++ is my primary language of choice. While I have been constantly focused on software development since the late 70's (as a kid), I've had the luxury of remaining current all this time. However, at each major epoch (C++11 for example), even those of us writing in C++ daily will had the very same experience you present (of catching up).
It is not so difficult if your C/C++ is not so rusty that you feel unsure of basic application targets.
Depending on how long it's been, a few observations which may date from the 80's forward:
- Use smart pointers, stl containers. std::shared_ptr has been overused (where, now, std::unique_ptr is often more appropriate, and std::scoped_ptr should be considered - also, revisit std::weak_ptr and why it's there).
- Remind yourself how C++ sort (from algorithm) can be faster than C's qsort function (that is, how providing more information to the compiler allows it to optimize/inline better).
- Don't concern yourself with many of the 'cute' solutions that aren't clear.
- Templates were, once, very heavy (back when 64 mega bytes - not giga bytes - was $1,000). They are no longer quite the burden. Use them when you need them and practice them.
- In C, the old built in types 'int' and 'float' exhibit object behavior. This isn't widely mentioned, but if you consider assembler, where the
programmer must select the appropriate standard operation instructions (+,-,*,/), in C the compiler does that automatically - and 'understands' the relationship between the two when mixing floats and ints in simple expressions. This association between appropriate methods (functions) and the type (the object) are central to object oriented thought. C's int and double exhibit a number of the behavior of objects in this respect, including the fact that this 'knowledge' is hidden from the programmer. They may not be considered objects from a C++ language perspective (they're not implemented as classes for example), but I'm attempting to say that 'objects' come to us from outside the language. We don't use trig to solve chemical equations, or drive a bicycle the way we drive a car. This notion of associating methods with things is at the heart of human thought about reality.
- Stroustrup's usually right ;)
- If you didn't catch this little history, there was a thing called auto_ptr, and you may find it referenced in texts. It is an error. Replaced with std::unique_ptr and std::scoped_ptr.
- Finally, we have the definition that a reference to a reference is a reference. You'll see && in code now, so too you'll find it discussed in the listed works. It's important, and fairly easy.
- std::unique_ptr allows moves, denies copies. For old hands this was a bit of a study and reorientation. It's all good.
- In C++, we use the C# var, but spell it auto ;)...auto's good, but auto leaves you a bit disoriented. Use it, but know that it isn't required or always better (just usually).
- Types get complicated. Use typedefs liberally to shorten the burden (some old hands had to be convinced).
It won't take that long to become current.
I just realized I'm late for an appointment....more to exchange if you like.....