The fun part is that you can still use plain old objects if you really really want to deal with C-Strings.
> It's in plain sight, very explicit and obvious to the eye.
And since RAII applies to variables the same is true in c++, unless you pretend to write C.
> and in case of virtual methods they might not even be resolved until runtime.
Except the type of a stack allocated object is known at compile time and ctors and dtors are part of that type. For operators you can also generally see from the type if they are overloaded and possibly virtual even if you are not dealing with directly stack allocated objects.
> The fun part is that you can still use plain old objects if you really really want to deal with C-Strings.
It's easy to see you've never seriously programmed C, because strings are like 0.1% of my concerns. They just work where they have to, and otherwise string manipulation is 99% done in places and where a C programmer wouldn't even do it.
> The fun part is that you can still use plain old objects if you really really want to deal with C-Strings.
yawn... But how exactly do I know that anything is a POD structure? And if everything is, so I can assume that anything is, where's all the advantages gone?
If you feel like it is too much effort you can just not do it? I can't remember the last time I checked, ctors and dtors should do basic setup and teardown. Counterquestion, how do you know a specific C struct wont overflow your stack without looking? We are assuming that everything important is visible inline, right?
> Strings are just buffers like any other, nothing special. It's easy to see you've never seriously programmed C
I have seen way too many hand rolled parsers on C, they may have been only 0.1% of the total code but they amounted for at least 50% of the bugs, along with the constant manual memory management and badly initialized variables.
> If string manipulation in C becomes annoying, you should have written a Python script.
That is an interesting statement to make for someone who claims to almost never write C string handling code. As someone who has to deal with strings, std::string is simply supperior in most cases so I prefer to use C++ where I have the choice.
> where's all the advantages gone?
That was in response to the "locked into a framework" claim.
It's all about creating the right abstractions. A parser is not about string handling! The typical (lexical) parser scans input from left to right and builds up (identifier and string literal) tokens by appending. So basically, you need a function input_read_char() and string_push_char(). You're done, there is no other string indexing or string allocation in a parser.
> That is an interesting statement to make for someone who claims to almost never write C string handling code
What I want to say is that if you're dealing with a lot of strings, you're working in a high-level glue domain. And there is no point in using either C or C++. You're probably making a web API, or an ad-hoc throwaway thing. It need not be python, possibly it should even be a shell or awk script. I write lots of those, typically they live and die in my command-line history, or as a 5-line script in my /tmp folder. Using C++ for these tasks would slow me down by 10x.
alloca() vs stack variables is something different, it's dynamic vs static allocation. You can literally see (ignoring optimization to make this point) all the stack variables that are part of the stack frame. It's in plain sight, very explicit and obvious to the eye. While calls to operator overloads and ctors/dtors are not visible in the plain syntax (type resolution is needed), and in case of virtual methods they might not even be resolved until runtime.
So please don't make me angry, this was a really weak refutal. Statements like this are why I am sometimes more critical at C++ than it maybe deserves.