133d722a9Sopenharmony_ci{{#title std::unique_ptr<T> — Rust ♡ C++}}
233d722a9Sopenharmony_ci# std::unique\_ptr\<T\>
333d722a9Sopenharmony_ci
433d722a9Sopenharmony_ciThe Rust binding of std::unique\_ptr\<T\> is called **[`UniquePtr<T>`]**. See
533d722a9Sopenharmony_cithe link for documentation of the Rust API.
633d722a9Sopenharmony_ci
733d722a9Sopenharmony_ci[`UniquePtr<T>`]: https://docs.rs/cxx/*/cxx/struct.UniquePtr.html
833d722a9Sopenharmony_ci
933d722a9Sopenharmony_ci### Restrictions:
1033d722a9Sopenharmony_ci
1133d722a9Sopenharmony_ciOnly `std::unique_ptr<T, std::default_delete<T>>` is currently supported. Custom
1233d722a9Sopenharmony_cideleters may be supported in the future.
1333d722a9Sopenharmony_ci
1433d722a9Sopenharmony_ciUniquePtr\<T\> does not support T being an opaque Rust type. You should use a
1533d722a9Sopenharmony_ciBox\<T\> (C++ [rust::Box\<T\>](box.md)) instead for transferring ownership of
1633d722a9Sopenharmony_ciopaque Rust types on the language boundary.
1733d722a9Sopenharmony_ci
1833d722a9Sopenharmony_ci## Example
1933d722a9Sopenharmony_ci
2033d722a9Sopenharmony_ciUniquePtr is commonly useful for returning opaque C++ objects to Rust. This use
2133d722a9Sopenharmony_cicase was featured in the [*blobstore tutorial*](../tutorial.md).
2233d722a9Sopenharmony_ci
2333d722a9Sopenharmony_ci```rust,noplayground
2433d722a9Sopenharmony_ci// src/main.rs
2533d722a9Sopenharmony_ci
2633d722a9Sopenharmony_ci#[cxx::bridge]
2733d722a9Sopenharmony_cimod ffi {
2833d722a9Sopenharmony_ci    unsafe extern "C++" {
2933d722a9Sopenharmony_ci        include!("example/include/blobstore.h");
3033d722a9Sopenharmony_ci
3133d722a9Sopenharmony_ci        type BlobstoreClient;
3233d722a9Sopenharmony_ci
3333d722a9Sopenharmony_ci        fn new_blobstore_client() -> UniquePtr<BlobstoreClient>;
3433d722a9Sopenharmony_ci        // ...
3533d722a9Sopenharmony_ci    }
3633d722a9Sopenharmony_ci}
3733d722a9Sopenharmony_ci
3833d722a9Sopenharmony_cifn main() {
3933d722a9Sopenharmony_ci    let client = ffi::new_blobstore_client();
4033d722a9Sopenharmony_ci    // ...
4133d722a9Sopenharmony_ci}
4233d722a9Sopenharmony_ci```
4333d722a9Sopenharmony_ci
4433d722a9Sopenharmony_ci```cpp
4533d722a9Sopenharmony_ci// include/blobstore.h
4633d722a9Sopenharmony_ci
4733d722a9Sopenharmony_ci#pragma once
4833d722a9Sopenharmony_ci#include <memory>
4933d722a9Sopenharmony_ci
5033d722a9Sopenharmony_ciclass BlobstoreClient;
5133d722a9Sopenharmony_ci
5233d722a9Sopenharmony_cistd::unique_ptr<BlobstoreClient> new_blobstore_client();
5333d722a9Sopenharmony_ci```
5433d722a9Sopenharmony_ci
5533d722a9Sopenharmony_ci```cpp
5633d722a9Sopenharmony_ci// src/blobstore.cc
5733d722a9Sopenharmony_ci
5833d722a9Sopenharmony_ci#include "example/include/blobstore.h"
5933d722a9Sopenharmony_ci
6033d722a9Sopenharmony_cistd::unique_ptr<BlobstoreClient> new_blobstore_client() {
6133d722a9Sopenharmony_ci  return std::make_unique<BlobstoreClient>();
6233d722a9Sopenharmony_ci}
6333d722a9Sopenharmony_ci```
64