gpt4 book ai didi

c++ - 模板特化中的类型(数组类型的 unique_ptr)

转载 作者:行者123 更新时间:2023-11-30 02:36:32 27 4
gpt4 key购买 nike

unique_ptr 有一个接受数组类型的选项 - 稍后有正确的删除器(使用数组 delete[]):

std::unique_ptr<std::string[]> up(new std::string[10]); // OK

unique_ptr 类本身的定义包括这种类型的特化(注意定义本身附近的 T[] 大括号):

template<typename T, typename D>
class unique_ptr<T[], D> { ... }

但是string[]或者int[]本身不就是一个类型吗所以它应该根据定义而不是 T[] 模板化为 T 类型?换句话说,模板引擎在 T 和 T[] 之间有何不同(如果我们只是用 T 代替 string[] - T[] 特化应该给我们 string[][] 类型,或者不应该?如果我们只是为 array_to_int 类型定义 int[],那么 T[] 替换不是 array_to_int[] 类型(即 int[][] 类型)吗?

换句话说,我们在这里显式地将 std::string[] TYPE 传递给模板 std::unique_ptr<std::string[]>它应该被替换为 T 本身,对吧?不是 T[] 吗?

最佳答案

std::unique_ptr<_Ty, _Dx> 有部分特化声明如下的类模板:

template<class _Ty, class _Dx>
class unique_ptr<_Ty[], _Dx> ... // this is the partial specialization

通过模板推导规则,当模板参数_TyT[] ,选择偏特化。这种部分特化提供了 std::unique_ptr<_Ty[], _Dx> 独有的功能例如operator[] (没有为非数组模板参数定义)。

模板特化的选择过程

首先,主模板始终是被查找的模板。然后使用该模板类或模板函数的任何可用特化检查实例化模板类或模板函数的参数。在此之后,选择最专业的一个(最佳匹配)。在你的情况下,std::string[]匹配T[]特化超过它的匹配T来自主模板。

关于c++ - 模板特化中的类型(数组类型的 unique_ptr),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32558651/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com