假设我有两个函数:
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>>;
两者似乎都工作得很好。所以我的问题是
- 哪种变体是首选?
- 这两种变体之间有什么实际的区别吗?
1条答案
按热度按时间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]
,这可能无法正常工作(就指针算术/释放而言)。如果有阵列,请使用阵列版本。