I first learned to program C++ in the 1990's, so I tend to think about C++ in pre-C++11 terms. |
I started in C back in the late 70's, and took up C++ in the late 80's. When C++ "2.0" was released (the version where templates were introduced), and the compilers began to support them, creating "our own" smart pointers and containers was one of the first things "everyone" (using C++) did. That was in the middle 90's.
So, yes, smart pointers are foundational to modern C++ development. What you are referencing as post C++11 (inclusive) ideas is the simple fact that smart pointers were first brought in as a standard in C++ at that time. Their use had already become central to the work long before.
Indeed, the entire idea of the smart pointer is a simple, direct example of RAII, which is even more fundamental than smart pointers themselves.
You will not find a competent C++ programmer this side of the 21st century writing any dynamic allocations that does not use smart pointers, unless everything goes into a container (which, if you think about it, is merely a different category of storage).
Smart pointers are containers for 1 (setting aside the notion of specializations for arrays and such).
Anyone telling you they are crutches is missing the point of the language and should not be referenced for any form of wisdom on the subject. Anyone who thinks that way has ignored all that happened in C++ since about 1994.
Also, learn all of them. Smart pointers are not always shared pointers. Shared pointers have their place, but they are quite often overused (in part because for a long while they were about the only smart pointer in use). Where the shared pointer is indicated, use it.
If you read any text regarding the relic "auto_ptr", be advised this is a deprecated version that has been replaced. It was a mistake (a fundamental flaw in the design went unnoticed for a while). It is still referenced in older texts and posts, but has been replaced by the likes of "unique_ptr" and "scoped_ptr".