But it’s not immediately transparent; you have to think.
See, that’s where you went wrong. Kids and their thinking. :) The trick is just to start writing c++, full speed ahead, damn the torpedos. It can be unsettling the first few times you jump out of the plane without a parachute, but then you get used to it. And I’m only half kidding. I’d be writing something and I’d be pretty sure it was the equivalent of Pandora’s box, but as long as I didn’t open it or think about the consequences, nothing too terrible would happen. Mostly worked out.
Ted, I’m just trying to process here, are you arguing for willful ignorance of C++ semantics as long as it works out well enough?
Yes…? Maybe I was lucky, but many of the situations in which I might have asked myself “what’s really going to happen here?” I survived without stopping to ask. My personal style tends towards “C with classes”, but we were doing some pretty weird stuff.
I wasn’t entirely ignorant of c++ semantics, but they weren’t internalized to the point where I could tell you what exactly a line of code was doing without sitting down and really picking it apart. For example, I can only think of one time where “But which constructor gets called?” ever mattered. Or for example, we used unions, but I never asked What kinds of types cannot be used as members of unions? Or any other Guru of the Week question.
I think people are afraid of c++ because it contains a million and one traps, but in my experience we (me) were able to plough forward without over thinking it. Don’t worry; be happy.
Of course, I may simply not appreciate just how terrible a c++ programmer I really was.
This sort of issue is one of the reasons that Rust is so interesting. It attempts to fill the same role as C++ while improving safety and avoiding becoming a complexity pit. It has a relatively small set of orthogonal systems that collectively enable the writing of large, safe systems program, and the performance (while not perfect) is quite competitive already.