There are different types of simplicity. There is simplicity involved in creating something and the simplicity of using it, and these 2 things are often opposed to each other. Raw pointers are simpler to create than smart pointers (the language feature, not an instance). They are easier to understand than smart pointers. They are harder to use correctly than smart pointers. How many bugs are a result of improper pointer use?
And if you look at code that uses raw pointers and the same code that has been modified to use smart pointers, the code that uses smart pointers will look simpler. It will look the same minus all the delete/free calls, and minus some NULL checks.
So yes, smart pointers are more complex in some sense. But if you consider the problem of enforcing the proper use of pointers, rather than just deferring that problem to the next programmer, smart pointers are a very simple solution to this problem (e.g. as opposed to something like garbage collection).
Not solving problems is simpler than solving them. I am all for not solving problems that don't need to be solved. But preventing pointer misuse seems like a problem worth solving, and it is solved elegantly with smart pointers.
This is just one example of something you can do with a more complex language like C++ that you can't do in C.