Oooh, I can come up with a list of pet hates instead:
- Destructors need to be virtual if you intend use polymorphically
- Sometimes members are initialized by default, sometimes they aren't
- Local clases can't be used as template parameters (makes them less useful)
- exception specifiers: look useful, but aren't
- function overloads hide base class functions with different signatures.
- no useful standardisation on internationalisation (portable standard wide charset, anyone? We'll have to wait until C++0x)
On the plus side
- hidden feature: function try blocks. Unfortunately I haven't found a use for it. Yes I know why they added it, but you have to rethrow in a constructor which makes it pointless.
- It's worth looking carefully at the STL guarantees about iterator validity after container modification, which can let you make some slightly nicer loops.
- Boost - it's hardly a secret but it's worth using.
- Return value optimisation (not obvious, but it's specifically allowed by the standard)
- Functors aka function objects aka operator(). This is used extensively by the STL. not really a secret, but is a nifty side effect of operator overloading and templates.