First, let us start with a famous quote: "There are only two kinds of languages: the ones people complain about and the ones nobody uses." The
are only two should be taken with a bit of salt.
I used C++ much more than C so I might be biased. But I honestly find most of the complains on C++ totally unfounded.
Each language has its quirks and idioms, but unlike other languages C++ never takes a break. And most complains sounds like this: "I find this feature not necessary for my project, so it is bad." or "I misused this feature and now I have a problem. The language sucks" or "I like this feature from language X, C++ does not have it and I do not care about (possibly superior) alternatives, the language suck".
The
real problems I see are: (1)horrible error messages, (2)no good places to learn it, (3)terrible community. (The strong adjectives are hyperboles...)
C is meant to be an universal assembly and this is what it does. Is this what you need? Good, do it. Don't waste your time to state how your language is better, it's not. Otherwise everyone would use it. Besides, many of the worst stuff in C++ come from its compatibility with C, I really think Stroustrup wanted to merge the two languages so the two standards committee could work together and define C as a subset of C++. It did not happened and now the two languages are separated.
C++ does much more, gives you a lot of extra flexibility and expression power. I goes from low level (almost) as C to high level. As consequence also the complexity increases, fortunately as programmers usually this complexity is hidden from you and you do not have to worry (Unless you finish in problem 1). An example I like to bring is about namespaces, you use them, they help you and they work as you naively expect. They are more complex of what you might think, but you do not really care unless you need to write a compiler. This point is fairly universal but once again, people see the problem on C++ but not on other languages; Java7 specification is longer than C++11 specification, yet you will hardly ever hear somebody stating "Java is more complex that C++" Why? Because usually this complexity does not really bother you.
About point 2, we are not in the '90 anymore and C++ should not considered as derived by C, now they are sibling languages, just like with Java. So, it should be thought as a new language, the C compatibility part is actually
advanced C++ that comes in if you want to make libraries or combining C++ with other languages. Yet, lots of people, even professionals, still teach C++ as "C with some more complex stuff." Obviously, as result, you have bad programmers that do not understand the advantages/differences of C++. Sure it's stupid that
int a[5] passed to a function decays to a pointer, but you should use std::array and not think about it. Sure the [[carries_dependency]] attribute is difficult to grasp, but do you really need it?
About point 3, the language is complex. The complexity is an unavoidable effect of having a such general purpose language, but as I said in most of the cases you do not really care. Yet, the community tend to focus on little technicalities more than helping. The effect is frustrated beginners and bad documentations. I saw multiple times almost unreadable documentation (overall in template libraries) when actually the functions worked as you naively expected. So, just writing a little example and a high level explanation
first and putting after the technicalities would make the read much easier.
I also notice an annoying elitarianism, just think that
the official FAQ insults you for trying to learn! Or the
How to mix C and C++ question does not bother to tell you how to map C++ exceptions in C code. You know catch(...)? Good. You don't? The FAQ does not help you.
I could continue for hours... but better stop.