I think this is probably the most important reason you list: interacting with existing C++ code, including templates.
I wonder if we could ever get direct Rust to C++ FFI. There are ways around it of course, by dropping down to C FFI in both languages.