我最近偶然发现了使用unique_ptr<T[]>,我明白的目的是删除指针delete[].
令我困惑的unique_ptr<T[3]>是相反无效(如果我错了,请纠正我).
模板中T []的类型是什么?它与T [3]有什么不同?这些是数组,所以它们不应该是一样的吗?T []作为模板中的类型还有其他用途吗?
Ker*_* SB 37
T[]是一种类型.它是"未知界限的数组T"类型.这是一种不完整的类型.
T[3]也是一种类型.它是"3的数组T" 类型.它是由不同类型的T[],只是想int和double是不同的类型.
该default_delete模板部分专门用于表单的不完整数组T[].但是,完全数组类型T[3]是禁止的,因为这会非常混乱:unique_ptr无法判断数组有多长,因为它只通过指向其第一个元素的指针来处理数组.
(机制中有技术细节:default_delete<T[3]>没有主动禁止专门化,但由于它的调用操作符需要a T(*)[3],它通常与来自的指针不匹配unique_ptr,即使调用格式正确,也是delete表达式不允许这样的指针(=具有未定义的行为).如果你愿意,你"无法删除数组",你只能通过大小擦除的指针"删除[]数组".)
请注意,make_unique对于完整的数组类型,将主动删除功能模板.
奇怪的是,make_shared委员会采取了不同的路线,允许完整的阵列类型.要做到这一点,shared_ptr<T[N]>有一个前提条件,你只能从匹配中构造它new T[N](虽然一般不可检查).(我从来都不明白为什么这是个好主意.)