天天看點

c++11:std::make_unique、std::make_unique_for_overwrite

頭檔案:<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';
    }
}
           

 運作結果:

c++11:std::make_unique、std::make_unique_for_overwrite

繼續閱讀