{{#title Built-in bindings — Rust ♡ C++}}
# Built-in bindings reference

In addition to all the primitive types (i32 <=> int32_t), the following
common types may be used in the fields of shared structs and the arguments and
returns of extern functions.

 name in Rust name in C++ restrictions
 String rust::String 
 &str rust::Str 
 &[T] rust::Slice<const T> cannot hold opaque C++ type
 &mut [T] rust::Slice<T> cannot hold opaque C++ type
 CxxString std::string cannot be passed by value
 Box<T> rust::Box<T> cannot hold opaque C++ type
 UniquePtr<T> std::unique_ptr<T> cannot hold opaque Rust type
 SharedPtr<T> std::shared_ptr<T> cannot hold opaque Rust type
 [T; N] std::array<T, N> cannot hold opaque C++ type
 Vec<T> rust::Vec<T> cannot hold opaque C++ type
 CxxVector<T> std::vector<T> cannot be passed by value, cannot hold opaque Rust type
 *mut T, *const T T*, const T* fn with a raw pointer argument must be declared unsafe to call
 fn(T, U) -> V rust::Fn<V(T, U)> only passing from Rust to C++ is implemented so far
 Result<T> throw/catch allowed as return type only

The C++ API of the `rust` namespace is defined by the *include/cxx.h* file in
the CXX GitHub repo. You will need to include this header in your C++ code when
working with those types. **When using Cargo and the cxx-build crate, the header
is made available to you at `#include "rust/cxx.h"`.**

The `rust` namespace additionally provides lowercase type aliases of all the
types mentioned in the table, for use in codebases preferring that style. For
example `rust::String`, `rust::Vec` may alternatively be written `rust::string`,
`rust::vec` etc.

## Pending bindings

The following types are intended to be supported "soon" but are just not
implemented yet. I don't expect any of these to be hard to make work but it's a
matter of designing a nice API for each in its non-native language.

 name in Rust name in C++
 BTreeMap<K, V> tbd
 HashMap<K, V> tbd
 Arc<T> tbd
 Option<T> tbd
 tbd std::map<K, V>
 tbd std::unordered_map<K, V>

