We all like to complain about the lack of some nifty features in C++ or the absence of "obvious" library functions. At the same time we lament the overwhelming complexity of the language. Torn between those two forces we often forget that the evolution of C++ is inherently bound to its core and decisions that were made decades ago.
To establish the basic sense of what C++ is and what's possible, we need to dig into its inner workings. In this talk I will explore the language design features like type system, memory model, and value semantics. I will discuss how they've come to be and what consequences they have on the development of the language. Why can't we just read the byte representation of an object from a disk and have up and running like in good old C? Why are continuations so ugly to write, whereas in Java they just work out of the box? Why do we need to take care of capturing or mutability of variables when writing lambdas - in Python there is no need for it! And can't we just make C++ more accessible, preferably by adding all the features from the .NET library?
I will explore answers to those and similar questions, discussing their underlaying rationale that stems from the core language features and design principles. I will discuss why certain things are what they are and why C++ actually is a very good language for its intended audience. This talk is for people who just start with C++ and who want to know what it is all about, but also for more experienced users who lost eye for why things are what they are.