1. For low level language C++ hides too much stuff, and for a high level language it is too clunky and segfaulty, while templates produce real mess, and other devs on a team will always harass you if you use a macro instead of a template, because Bjarne said something somewhere about macros being the tool of the devil. I.e. C++ is more of a strict religious cult, one has to better stay away from.
You are not representing Bjarne stance correctly, macros had couple big flaws that make hard to work with them, like
FOO(a + b) <===> 5 * a + b
BAR(++i) <===> foo(++i, ++i)
std::max(i, j) <===> std:: (i < j ? j : i)
This is why Bjarne SUGGEST to do not use them, in most cases templates are superior replacement for macors, but in cases where you effective generate code they should be still used, I did exactly this in OXCE, I made big meta-template library but at some point I was forced to use lot of macros for class generation.
Bjarne want that in long run macros will be removed from language but this will need new functionality that do not exist yet in C++, unit then there is still cases where you need use them, but most typical C use cases are not correct for C++.
I even make macro names more ugly with prefix `MACRO_`:
https://github.com/MeridianOXC/OpenXcom/blob/oxce-plus/src/Engine/Script.cpp#L46My favorite example of superiority of tempates over macros is my:
https://github.com/MeridianOXC/OpenXcom/blob/oxce-plus/src/Engine/ShaderDraw.h#L39A lot of C++ code that finally is converted to sse instructions
2. C++ indulges what Joel Spolsky called "architecture astronautics", akin to building a grocery store at Alpha Centauri, so clients will fly a rocket there to buy an apple. I.e. C++ offers a lot of tools that impede and complicate thinking. That is job security for sure, but not when you're working on a personal project, which you want to just get finished in as quickly as possible, so you can use it to say create art for you game.
You can impede and complicate thinking in any language you want, if it have enough tools this is doable, and C++ is not exception.
Another thing is you use correct tools then make opposite, see `std::unique_ptr` and `std::shared_ptr`. With this two helpers you can nearly remove all memory problems because every function will be statically analyzed for correctness. And if every function is correct then whole program is correct. You can't do something like this with normal pointers.
I can verify this in OXCE script code, I had only once memory problem in my code base and this was because I do not initialize one structure correctly (and this was during developing new feature).
And my code is complex as hell and allocate a lot of memory (and hard part is it do this only when its really needed).
3. Finally, C++ has no proper ABI, it is a thing in itself. Major C's fault is unrestricted pointers which can reference the same memory, so compiler can't make any assumptions. But that is actually a boon, since you can always explicitly restrict pointers, when you're sure about it. It is funny since I learned C++ before C, but then gradually downshifted to the plain C.
This is true, you can't easy link with C++ code but you already have escape hatch in `extern "C"` that create plain C functions that can link.
For pointers, but how many times you miss this addnotation and because of this optimization opportunity?
In some computation kernel you can easy manually adjust this to have best performance, but what about 99% of rest of code base that have millions of lines?
In C++ you have this by default. Of corse in some context is not easy to disable them (especially if you want to be fully conforming with standard).
I very like C++ (especially new version C++17) but I do not negate it have flaws but if you write your code correctly you will never have problems with them
but if you have wrong approach then you will have only pain when working with it (including missing limbs).