I admit gave a somewhat pessimistic assessment. However, I do believe that what I said is true.
You will never know it all. The language just has too many special cases to deal with the corners where features meet. |
You can never be sure you are aware of special cases in the language. You might read some obscure article and think, "Wow, I didn't realise that". Case in point for me recently was the pointer to member data thread. I've done a lot of background reading since and now know a lot about a feature I will never use in normal business domain production code. But is it a useful nonetheless. I'm grateful to whoever started that thread.
And once you think you get it, some nutter wants to improve it with a new standard. |
A philosophy of C that C++ inherited was, keep the language simple. Build the complexity in libraries. I think C++ 11 has departed from that. Some features are really nice and much more convenient use in C++ 11, that's a matter of fact. But that means
improving the compiler.
In production, only subsets of the language tend to be used because if a developer doesn't understand the code he's been presented, but landed the responsibility to make it work, he'll just rewrite it in a simpler way. |
One man's refactor is another man's rewrite. "I'll just change this to that and this other thing to that and it'll be all right." Well, in my experience it's rarely that simple when there's some clever architecture behind it. You call it refactoring, I call it rewriting. Once you've touched it, it needs to be fully tested again.
Look at it this way, do you remember what Design Patterns are? They're ways of doing things developed with experience. All experienced developers carry around a lot of standard ways of doing things. You walk into a company and given some bug to fix in 1 day. You look at the code and think, "Oh no, why did they do it like that, all you have to do is this". You do it, fix the bug, you've cleaned up the area of code, everyone's a winner. But you might have removed some hook designed into the system, you've traded flexibility for reliability; and that's ok. It happens all the time. Degrees of freedom come at a price; complexity, reliability, efficiency.
the vendors can't keep up either. |
I've been using C++ for a long time. The compilers have never been fully compatible. The standard is meant to ensure this compatibility. But each compiler has it's own history, features, idiosyncrasies, incompatibilities. We were finally at a point where different vendors were converging on the standard and now the goal posts have moved.