> Yet nobody has ever been able to justify why it's necessary to dispense with the entirety of C and C++ to achieve memory safety.
As soon as you make a backwards incompatible change, you've already made a new language, effectively. Because:
> For example, you could create a fork of C++ that merely compile-errors when you use a pointer and not a reference unless you enclose it in some `unsafe` block that you invented
This means that effectively all C++ code would fail to compile under this implementation.
> One can simply start with C++ augmented so that everything is const by default; that is the ideal progress to me.
This is nowhere near enough to achieve the goal. Sure, it's a thing someone could do. But it's kind of irrelevant.
> This means that effectively all C++ code would fail to compile under this implementation.
You're implying that all C++ code uses pointers and that's patently false. It's even false for C code. Pointers was the first thing C++ boxed with references. Box it more. Forks of C++ even exist, like GNU++ extensions. There's a whole spectrum of possibilities between that and where you are right now and I don't see why everyone needs to cross this chasm and embrace Rust at this cost.
Breaking one part of the language doesn't break everything for everyone. That's definitely a fallacy if it couches the justification I'm chasing here.
As soon as you make a backwards incompatible change, you've already made a new language, effectively. Because:
> For example, you could create a fork of C++ that merely compile-errors when you use a pointer and not a reference unless you enclose it in some `unsafe` block that you invented
This means that effectively all C++ code would fail to compile under this implementation.
> One can simply start with C++ augmented so that everything is const by default; that is the ideal progress to me.
This is nowhere near enough to achieve the goal. Sure, it's a thing someone could do. But it's kind of irrelevant.