我正在实现循环数组数据结构,其代码如下:
实现后,我使用了
以下是 cppreference 对于第 (2) 个签名的说明:
struct CircularArrayException : public std::exception {
std::string msg;
CircularArrayException(const std::string arg_msg)
: msg{"CircularArrayException: " + arg_msg} {}
const char * what () const throw () {
return msg.c_str();
}
};
template <typename T>
class CircularArray {
public:
const size_t array_size;
std::unique_ptr<T> uptr_arr;
size_t occupied_size = 0;
int front_idx = -1;
int back_idx = -1;
CircularArray(const CircularArray& ca) = delete;
CircularArray& operator=(const CircularArray& ca) = delete;
CircularArray(
const size_t arg_array_size
): array_size{arg_array_size} {
uptr_arr = std::make_unique<T>(array_size);
};
};
实现后,我使用了
CircularArray<char>
进行了测试并且它正常运行。
但是,然后我意识到我们使用的是 std::make_unique<char[]>(num_elements)
声明一个指向数组的 unique_ptr,而不是 std::make_unique<char>(num_elements)
。但即使如此,代码似乎仍然能够正常工作。我查看了 std::make_unique
的文档 这里,但无法理解第 (2) 个签名的解释。有人可以帮我理解其中的区别,以及为什么我的代码可以工作吗?以下是 cppreference 对于第 (2) 个签名的说明:
template< class T >
unique_ptr<T> make_unique( std::size_t size );
(2) (自C++14起) (仅适用于具有未知边界的数组类型)
构造一个未知边界的 T 数组。只有当 T 是具有未知边界的数组时,该重载才参与重载解析。函数等价于: unique_ptr<T>(new typename std::remove_extent<T>::type[size]())
这里是Goldbolt链接: https://godbolt.org/z/K9h3qTeTW
make_unique()
不需要大小参数,因此该参数仅用于初始化创建的对象。只需使用调试器逐步执行代码或研究cppreference.com上的文档即可找出答案。顺便说一句:当你可以直接使用vector
时,我会质疑你使用动态分配的选择。考虑在codereview.stackexchange.com上提交你的代码(一旦它正常工作)。 - Ulrich Eckhardtmake_unique
的 (2) 签名是什么意思。 - Kishore Kaushal