In C++, being fast is everything. You never copy a value, if you can pass a reference to it. Because copying takes time. Or, adding a count to an array (like, a string) is bad, because keeping it up to date costs a lot of overhead.
That's also why there are many ways to do the same thing in C++, of which most are considered "harmful". It's up to the programmer to know which ones and when, and not to use them.
Really, every time someone talks about the "do's and dont's" of programming, they're either discussing C++ or JavaScript. Because those two are a minefield. Almost all the things your really shouldn't do, are a non-issue in almost every other programming language. They won't allow it.
In Pascal, correctness is everything. It goes through great lengths to prevent you shooting yourself in your foot. Everything should be logical and consistent. It should be obvious to the programmer what is going to happen. Just casting any data type to and from a generic pointer is not something you want to encourage.
Most of the time, you don't want a reference to a variable, you want a copy. Simply to prevent many bugs. And if you really want a reference, specify it ("var").
In C++, there are three obvious ways to pass a parameter (copy, pointer, reference). Most of the time, it is not obvious which one to choose, and your program probably compiles anyway. While you have to use the exact same one as the function expects. Which is probably why the most common data type is "void *". Or: no defined type, the compiler will allow anything.
In my experience, most Pascal bugs are caught by the compiler. Most C++ bugs happen at a different location than where the runtime exception happens. And it's far easier to create them.