https://doc.rust-lang.org/std/boxed/index.html:
So long as T: Sized, a Box<T> is guaranteed to be represented as a
single pointer and is also ABI-compatible with C pointers (i.e. the C
type T*).
These are going to need to diverge shortly. Indirect args can pass from
Rust to C++ as *const T from which C++ will do an unsafe ptr::read, but
need to pass from C++ to Rust as *mut T to leave a zero value in the old
location for when the C++ destructor runs.