天天看点

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

继续阅读