假设我有两个功能:
const char* get_string(int id);
bool free_string(const char* str);
我想为他们写一个
std::unique_ptr
包装纸
从这个答案我创建了以下内容:
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>>;
两者似乎都工作得很好。所以我的问题是:
unique_ptr<T, Deleter>
和unique_ptr<T[], Deleter>
之间的主要区别是:
operator[]
,单个版本有operator*
和operator->
。这强调了这样一个事实,即不仅仅是一个元素,因为更难获得对第一个元素的引用。U(*)[]
是否可转换为 T(*)[]
而不是简单地 U*
到 T*
。这对 T = const char
不是很有用,但对于类类型,它可以防止将 derived_type[N]
转换为 base_type[N]
,这可能无法正常工作(在指针算术/释放方面)。如果您有数组,请使用数组版本。