c++ std::unique_ptr与自定义删除器:正则与数组类型

biswetbf  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(120)

假设我有两个函数:

const char* get_string(int id);
bool free_string(const char* str);

我想为它们写一个std::unique_ptr Package 器。
this answer中,我创建了以下代码:

template <auto fn>
struct deleter_from_fn {
    template <typename T>
    constexpr void operator()(T* arg) const {
        fn(arg);
    }
};

using my_string_unique_ptr =
    std::unique_ptr<const char, deleter_from_fn<free_string>>;

但我又想,它不是一个指向const char的指针,它是一个指向字符数组的指针。因此,我将其替换为以下内容:

using my_string_unique_ptr =
    std::unique_ptr<const char[], deleter_from_fn<free_string>>;

两者似乎都工作得很好。所以我的问题是

  • 哪种变体是首选?
  • 这两种变体之间有什么实际的区别吗?
i7uq4tfw

i7uq4tfw1#

unique_ptr<T, Deleter>unique_ptr<T[], Deleter>的主要区别是:

  • 阵列版本有operator[],单个版本有operator*operator->。这强调了一个事实,即不只是一个元素,因为获取对第一个元素的引用更加困难。
  • 当从不同类型的指针构造数组版本时,它将检查U(*)[]是否可以转换为T(*)[],而不是简单地将U*转换为T*。这对于T = const char不是很有用,但是对于类类型,它可以防止将derived_type[N]强制转换为base_type[N],这可能无法正常工作(就指针算术/释放而言)。

如果有阵列,请使用阵列版本。

相关问题