頭檔案:<memory>
template<class T, class... Args > unique_ptr<T> make_unique( Args&&... args ); | (1) (C++14 起) (僅對非數組類型) |
template< class T > unique_ptr<T> make_unique( std::size_t size ); | (2) (C++14 起) (僅對未知邊界數組) |
template< class T, class... Args > make_unique( Args&&... args ) = delete; | (3) (C++14 起) (僅對已知邊界數組) |
template< class T > unique_ptr<T> make_unique_for_overwrite( ); | (4) (C++20 起) (僅對非數組類型) |
template< class T > unique_ptr<T> make_unique_for_overwrite( std::size_t size ); | (5) (C++20 起) (僅對未知邊界數組) |
template< class T, class... Args > make_unique_for_overwrite( Args&&... args ) = delete; | (6) (C++20 起) (僅對已知邊界數組) |
功能:構造T類型對象并将其包裝進std::unique_ptr。
參數:
- args:将要構造的T執行個體所用的參數清單。
- size:要構造的數組大小
#include <iostream>
#include <memory>
struct Vec3
{
int x, y, z;
// C++20 起不再需要以下構造函數
Vec3(int x = 0, int y = 0, int z = 0) noexcept : x(x), y(y), z(z) { }
friend std::ostream& operator<<(std::ostream& os, const Vec3& v)
{
return os << '{' << "x:" << v.x << " y:" << v.y << " z:" << v.z << '}';
}
};
int main()
{
// 使用預設構造函數。
std::unique_ptr<Vec3> v1 = std::make_unique<Vec3>();
// 使用比對這些參數的構造函數
std::unique_ptr<Vec3> v2 = std::make_unique<Vec3>(0, 1, 2);
// 建立指向 5 個元素數組的 unique_ptr
std::unique_ptr<Vec3[]> v3 = std::make_unique<Vec3[]>(5);
std::cout << "make_unique<Vec3>(): " << *v1 << '\n'
<< "make_unique<Vec3>(0,1,2): " << *v2 << '\n'
<< "make_unique<Vec3[]>(5): " << '\n';
for (int i = 0; i < 5; i++) {
std::cout << " " << v3[i] << '\n';
}
}
運作結果: