使用T []作为模板参数

时间:2018-01-09 11:12:04

标签: c++

我最近偶然发现unique_ptr<T[]>的使用,我明白目的是删除delete[]指针。

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

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

1 个答案:

答案 0 :(得分:37)

T[]是一种类型。它是“T未知范围的数组”。这是一种不完整的类型。

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

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]构建它(尽管通常不可检查)。 (我从来都不明白为什么这是个好主意。)