I think implicit type conversion is a mistake, perhaps one of the few true design flaws in C. Languages like haskell and rust went with explicit conversions which is probably a better idea overall, even if it does increase the code verbosity a bit. C++ instead doubled down and added many more ways for implicit conversions to happen.
but also allows you to turn them off for objects, thankfully.
If you would then say "why doesn't min/max just implement a switch on each primitive type", I think on some level it does just do that.
The Linux kernel is one of the few cases where just the sheer scale of instances may make a difference
Of course there are others than C. But not many suitable for writing a kernel. And no obvious choice for what Linux could do today. Of course they are starting with Rust, but nobody can predict when that will make the last C macro unnecessary. Unless your prediction is never...
Even Linus accepting Rust is kind of interesting, because his C++ rants also apply to plenty of Rust code bases.
Whereas C++ tends to make you eat the whole enchilada.
Also see Embedded C++ as used by macOS IO Kit, which thankfully there isn't a Linus at Apple.
Regarding Rust, no_std, doesn't change the npm like dependencies, macro festival (with two ways of doing all kinds of stuff), abstraction party with type driven development, the compile times.
Partly this is because Rust thought about this earlier, and partly it's because of the relationship between C++ and the allocator, having operators for a feature which might not even exist on your target, awkward.
This doesn't mean using C++ for kernels and such is impossible, but anyone with a conservative, risk-averse mindset (like Linus) isn't going to want to touch it.
Rust, on the other hand, was deliberately designed for such uses, starting from a fresh sheet of paper. Giving systems programmers everything they want without any hidden "gotchas" is its whole raison d'être.
My strong impression is that both Apple and Microsoft are moving away from C++ in their core systems.
C++, otoh, is run by committee and far removed from the community. (C is not much better, but at least they are stable)
It is hard to be close to a community with the size and divergence of the C++ one. It is (relatively) easy to be close to a community the size of the Rust one.