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