如何使用 make_unique 构造数组

How to construct an array using make_unique

如何使用std::make_unique构建std::array

在以下代码中 uptr2 的声明无法编译:

#include <iostream>
#include <array>
#include <memory>


int main( )
{
    // compiles
    const std::unique_ptr< std::array<int, 1'000'000> > uptr1( new std::array<int, 1'000'000> );
    // does not compile
    const std::unique_ptr< std::array<int, 1'000'000> > uptr2 { std::make_unique< std::array<int, 1'000'000> >( { } ) };

    for ( const auto elem : *uptr1 )
    {
        std::cout << elem << ' ';
    }

    std::cout << '\n';
}

std::make_unique< std::array<int, 1'000'000> >( { } ) 无法编译,因为 std::make_unique 函数模板通过转发引用采用任意数量的参数,并且您不能将 {} 传递给转发引用,因为它具有没有类型。

但是,std::make_unique< std::array<int, 1'000'000> >() 工作正常。它以与声明 auto a = std::array<int, 1'000'000>(); 相同的方式初始化 std::array 对象:即值初始化。就像 {} 的聚合初始化一样,在这种特定类型的情况下,值初始化会将其初始化为全零。