我最近偶然发现unique_ptr<T[]>
的使用,我明白目的是删除delete[]
指针。
令我感到困惑的是unique_ptr<T[3]>
无效(如果我错了,请纠正我)。
模板中T []的类型是什么?它与T [3]有什么不同?这些是数组,所以他们不应该是一样的吗? T []作为模板中的类型还有其他用途吗?
答案 0 :(得分:37)
T[]
是一种类型。它是“T
未知范围的数组”。这是一种不完整的类型。
T[3]
也是一种类型。它是“3 T
的数组”类型。它与T[]
的类型不同,就像int
和double
不同类型一样。
default_delete
模板专门针对T[]
形式的不完整数组。但是,像T[3]
这样的完整数组类型是被禁止的,因为这会非常令人困惑:unique_ptr
无法判断数组有多长,因为它只通过指向第一个元素的指针来处理数组
(机制中有技术细节:专门化default_delete<T[3]>
未被主动禁止,但由于其调用操作符需要T(*)[3]
,因此它通常与来自{unique_ptr
的指针不匹配。 {1}},即使调用格式正确,也不允许在这样的指针上使用delete
表达式(=有未定义的行为)。如果你愿意,你“无法删除数组”,你只能“通过大小擦除的指针删除[]数组“。)
请注意,make_unique
函数模板已被主动删除,以用于完整的数组类型。
奇怪的是,对于make_shared
,委员会采用了不同的路线,允许完整的数组类型。为此,shared_ptr<T[N]>
有一个前提条件,即您只能从匹配的new T[N]
构建它(尽管通常不可检查)。 (我从来都不明白为什么这是个好主意。)