The core issue, from what I can see, is not C++ or Unity3D, but rather do you need a high-level solution or a low-level solution.
A low-level solution is one which you get dirty with the processes of handing input, managing memory or loading the models. A high-level solution is which you get one neat package, like Unity3D.
To me, whether to use Unity3D (or any other game engine) or C++ depends on the goals of your game and project.
Use Unity3D, if development time has to be quick and/or your game is not performance intensive or is not on the high end of graphical/computational performance. If you wish to concentrate on the game-play, and the default tools that Unity3D provide is all right, you may wish to consider using Unity3D
C++ with other libraries, if you have longer development time, the game requires more computational/graphical power, or employs some technology that Unity3D cannot incorporate.
Where does that leave C++? C++ is a language, and there are many programming concepts you do in C++ you can do in Unity3D, sans memory management or perhaps templates ( With Unity 3.2, the language specs have improved to cover closures, for example).
So as I have stated, it's not really C++ vs. Unity3D. It is more of "C++ plus libraries/SDK or roll your own engine" vs. Unity3D. It depends on your goals and objectives. For high-end games or games where you need control over the rendering pipeline or input, you may want to use C++ plus an engine which allows you to mess under the hood. If not, I go with Unity3D as my default choice for 3D games.
However, knowledge with Unity3d is not under the hood experience, but it is a good place to start for learning the overall process of developing games. For instance, you probably will need a semester worth of studying to write a renderer and load a model in OpenGL, plus a basic scenegraph and input. You get that done in Unity3D in less than a day.