是否可以初始化 unique_ptr 数组的元素? [重复]

问题描述 投票:0回答:1

我使用堆内存作为一个小示例的一部分,最后我写了这个:

    double* p = new double[4] { 0.0, 1.0, 2.0, 3.0 };
...
    delete[] p;

后来我想把它升级为

std::unique_ptr
:

    std::unique_ptr<double[]> arrp(new double[4] { 0.0, 1.0, 2.0, 3.0 });
...

(不需要

delete[]
)。

当然,使用

std::make_unique
总是比 new 更好,但是 如何使用
std::make_unique
初始化元素数组?

c++ arrays new-operator unique-ptr
1个回答
0
投票

为了回答我自己的问题,这是一个糟糕的、不好的、低效的实现,我不一定想使用。

最多可以澄清我在问题中想要的内容。

#include <memory>
#include <utility>
#include <type_traits>

namespace xtd {
    template<class T, class T2>
    auto make_unique(std::initializer_list<T2> il) {
        if constexpr(std::is_array_v<T>) {
            std::unique_ptr<T> ret(new std::remove_extent_t<T>[il.size()]);
            std::uninitialized_copy(il.begin(), il.end(), ret.get());
            return ret;
        } else {
            return std::make_unique<T>(il);
        }
    }
}

int main() {
    std::unique_ptr<double[]> p(new double[4] { 0.0, 1.0, 2.0, 3.0 });

    auto q = xtd::make_unique<double[]>({0.0, 1.0, 2.0, 3.0});
}

https://godbolt.org/z/d11h8WhEo

© www.soinside.com 2019 - 2024. All rights reserved.