* No compile time encapsulation
* Outstandingly complicated grammar
* No way to locate definitions
* No run time encapsulation
* No binary implementation rules
* No reflection
* Very complicated type system
* Very complicated type-based binding rules
* Defective operator overloading
* Defective exceptions
* Duplicate facilities
* No high-level built-in types
* Manual memory management
* Defective metaprogramming facilities
* Unhelpful standard library
* Defective inlining
* Implicitly called & generated functions
Everything in that list that includes the words "defective", "complicated" or "unhelpful" is an opinion.
If we eliminate those, the list reduces down to about eight objective criticisms, of which several are just wrong (No high-level types? Bzzt. The STL is part of the language), and others that are minor variants of the same complaint (that it's not a dynamic language).
The quoted site explains in depth the words "defective", "complicated" or "unhelpful" (and about STL being high-level too).
I've posted a short outline to provide a context for the link. It is easy to read and the critique it provides is worth reading by any C++ programmer.
Do not believe my words, just try to read it and see for yourself.
EDIT: I want to make it clear. C++ is a valuable tool for some tasks. But.. No size fits all. And knowing the weaknesses of the tool at hand does not hurt either.
Yes, I've read the site before. I don't have the time or inclination to rebut every point that he makes, but many of his criticisms boil down to the fact that he just doesn't like the complexity of C++ (which is fair, but it's still just his opinion.)
The "high-level" criticism, in particular, quickly devolves into a complaint about the complexity of template generics, and how the error messages emitted by current C++ compilers are cryptic. It's unclear what his solution to the problem would be, short of a fully dynamic type system.