“C++ is a complicated language.” This is a reputation C++ has earned across a number of decades of use, and not always for the right reasons. Often, this is used as a reason to disallow people from learning C++, or as a reason why a different programming language would be better.
These arguments are hard to substantiate because the basic premise they rely on is wrong: C++ is not a complicated language.
The biggest problem C++ has is its reputation, and the second biggest problem is the lack of high-quality educational materials for learning it.
The language itself has evolved over the past four decades from C. It started off as being a fork of C (with minor additions) and a pre-compiler called Cfront, which compiles early C++ code to C that is then to be processed with the C compiler. Hence the name Cfront—in front of C.
After a few years of progress and development, this proved to limit the language too much and work was undertaken to create an actual compiler.
This compiler, written by Bjarne Stroustrup (the original inventor of the language), could compile a C++ program stand-alone.
Other companies were also interested in continuing from basic C support and made their own C++ compilers, mostly compatible with either Cfront or the newer compiler.
This proved to be untenable because the language was unportable and wildly incompatible between compilers.
Not to mention the fact that keeping all decisions and direction within the hands of a single person is not the way to make a cross-company international standard—there are standard procedures for that, and organizations that manage them.
C++ was thus moved to become an ISO standard belonging to the International Standards Organization. After a number of years of development, the first official C++ standard came out in 1998, and people rejoiced.
They rejoiced for only a short while though, because while C++98 was a good definition, it had included a few new developments that people didn’t see coming, and had some features that interacted in weird ways.
In some cases the features themselves were well-written, but the interaction between common features was just not present—for example, being able to have a filename as a std::string and then opening a file with that.
Another late addition was support of templates, which was the main underlying technology supporting the Standard Template Library, one of the most important pieces in C++ today.
Only after its release did people discover that it itself is Turing complete, and that many advanced constructs could be done by doing computations at compile time.
This greatly enhanced the ability for library writers to write generic code that would be able to handle arbitrarily complex deductions, which was unlike anything other languages in existence at the time could do.