我最近偶然发现了 unique_ptr<T[]>
的用法,据我所知,目的是用 delete[]
删除指针.
令我困惑的是unique_ptr<T[3]>
相反无效(如果我错了,请纠正我)。
模板中 T[] 的类型是什么?它与 T[3] 有何不同?这些是数组,所以它们不应该相同吗? T[] 作为模板中的类型还有其他用途吗?
最佳答案
T[]
是一种类型。它是“T
的未知边界数组”类型。它是一个不完整的类型。
T[3]
也是一种类型。它的类型是“3 个数组 T
”。它与 T[]
的类型不同, 就像 int
和 double
是不同的类型。
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/