c++ - 使用 T[] 作为模板参数

标签 c++

我最近偶然发现了 unique_ptr<T[]> 的用法,据我所知,目的是用 delete[] 删除指针.

令我困惑的是unique_ptr<T[3]>相反无效(如果我错了,请纠正我)。

模板中 T[] 的类型是什么?它与 T[3] 有何不同?这些是数组,所以它们不应该相同吗? T[] 作为模板中的类型还有其他用途吗?

最佳答案

T[]是一种类型。它是“T 的未知边界数组”类型。它是一个不完整的类型。

T[3]也是一种类型。它的类型是“3 个数组 T”。它与 T[] 的类型不同, 就像 intdouble是不同的类型。

default_delete模板部分专门用于 T[] 形式的不完整数组.但是,像 T[3] 这样的完整数组类型被禁止,因为那会很困惑:unique_ptr无法判断您的数组有多长,因为它仅通过指向其第一个元素的指针来处理数组。

(机制中有技术细节:特化 default_delete<T[3]> 并未被主动禁止,但由于其调用运算符期望 T(*)[3] ,它通常不会匹配来自 unique_ptr 的指针,并且即使调用格式正确,也不允许在此类指针上使用 delete 表达式(= 具有未定义的行为)。如果愿意,您“不能删除数组”,您只能通过大小删除“删除 [] 数组”指针”。)

请注意 make_unique完整数组类型的函数模板被主动删除。

奇怪的是,对于 make_shared委员会走了一条不同的路线,允许完整的数组类型。为此,shared_ptr<T[N]>有一个前提条件,即您只能从匹配的 new T[N] 中构造它(尽管这通常是不可检查的)。 (我一直不太明白为什么这是个好主意。)

关于c++ - 使用 T[] 作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48166918/

相关文章:

c++ - 如何防止 boost logger 在每条记录后添加\n?

c++ - 抽象基类中私有(private)虚函数的可见性

c++ - OpenMesh 无法在最小/最大宏处于事件状态的情况下进行编译

c++ - 在父类中访问子类的功能

c++ - MS strncpy_s 的替代品

c++ - 如何使用 boost.log 写入文件?

c++ - 使用空树合并 AVL 树(C++ 模板)

c++ - MSVC中从_Ty到int警告的转换累积

c++ - Kruskal算法和不相交集数据结构: Do I need the following two lines of code?

c++ - 在 C++ 控制台窗口中显示表格