A lot of #cplusplus makes a lot more sense if you can keep in mind what the language's design is optimizing for.
... which is "Letting the compiler figure things out with a minimum number of re-passes over the code."
This is, in these modern times, a very stupid thing[1] for it to optimize for at the language-design level, but it does help illuminate a lot of what seem like otherwise stupid constraints on the language.
[1] I'm making a strong assertion here, but I'm justifying it on observation that the reason you want minimum passes is to optimize compilation time. In that regard, relative to the languages I regularly use, C++ takes about a billion years to compile a codebase of a dozen files, three compilation units, and ~5,000 lines of code, while the TypeScript compiler is "boom-boom done" and the Python compiler is "What compiler?"