C++ 模板专门化中的类型(数组类型的唯一\u ptr)

C++ 模板专门化中的类型(数组类型的唯一\u ptr),c++,arrays,templates,c++11,C++,Arrays,Templates,C++11,unique_ptr有一个选择,可以选择数组类型-以便在以后使用正确的deleter(使用数组delete[]): std::unique_ptr up(新std::string[10]);//好的 unique_ptr类本身的定义包括该类型的专门化(注意定义本身附近的T[]括号): 模板 类唯一\u ptr{…} 但是字符串[]或int[]本身不是一种类型吗 因此,应该根据定义将其模板化为T类型,而不是T[]? 换句话说,模板引擎在T和T[]之间有何区别(如果我们只是将T替换为string[

unique_ptr有一个选择,可以选择数组类型-以便在以后使用正确的deleter(使用数组delete[]):

std::unique_ptr up(新std::string[10]);//好的

unique_ptr类本身的定义包括该类型的专门化(注意定义本身附近的T[]括号):

模板
类唯一\u ptr{…}
但是字符串[]或int[]本身不是一种类型吗 因此,应该根据定义将其模板化为T类型,而不是T[]? 换句话说,模板引擎在T和T[]之间有何区别(如果我们只是将T替换为string[])-T[]专门化应该为我们提供string[][]类型,还是不应该? 如果我们只为数组类型键入def int[],那么T[]替换不是数组类型吗

换句话说,我们在这里显式地将std::string[]类型传递给模板
std::unique\u ptr

它应该被替换为T本身,对吗?不是T[]?

std::unique_ptr类模板有一个部分专门化,声明如下:

template<class _Ty, class _Dx>
class unique_ptr<_Ty[], _Dx> ... // this is the partial specialization
模板
类unique\u ptr…//这是部分专门化
通过模板演绎规则,当模板参数
\u Ty
T[]
时,选择部分专门化。此部分专门化提供了
std::unique\u ptr
独有的功能,如
运算符[]
(未为非数组模板参数定义)

模板专业化的选择过程


首先,主模板始终是要查找的模板。然后将使用该模板类或模板函数的任何可用专门化检查实例化模板类或模板函数的参数。然后,选择最专门化的一个(最佳匹配)。在您的示例中,
std::string[]
T[]
专门化的匹配程度大于与主模板中的
T
的匹配程度。

存在
std::unique\u ptr
类模板的部分专门化,声明如下:

template<class _Ty, class _Dx>
class unique_ptr<_Ty[], _Dx> ... // this is the partial specialization
模板
类unique\u ptr…//这是部分专门化
通过模板演绎规则,当模板参数
\u Ty
T[]
时,选择部分专门化。此部分专门化提供了
std::unique\u ptr
独有的功能,如
运算符[]
(未为非数组模板参数定义)

模板专业化的选择过程


首先,主模板始终是要查找的模板。然后将使用该模板类或模板函数的任何可用专门化检查实例化模板类或模板函数的参数。然后,选择最专门化的一个(最佳匹配)。在您的示例中,
std::string[]
匹配的
T[]
专门化比它匹配的
T
来自主模板的要多。

但是为什么提供的类型(比如int[])本身不被T替代?也就是说,为什么它被T+[]替代@barney将部分专门化视为模式匹配可能会有所帮助。您不向部分专门化提供参数,而是在主模板提供的参数与模式匹配时使用它。@t.C.因此,当我编写部分专门化并使用[]扩展类型t时或者*或者其他——它更倾向于将其作为模式匹配/我类型本身的元素进行审查?因此T[]不是[]到T的加法,对吗?(让我困惑的是,在语言的其他部分,我实际上可以向我的类型添加一些东西:
使用UniquePtr=std::unique_ptr的模板;
会将我原来的
UniquePtr
替换为
std::unique_ptr
有效地向类型添加一些东西,而不是用T+[]。这就像有一个方孔和一个直径相同的圆孔。可以将圆钉装入方孔中,但圆钉的最佳匹配是圆孔。因此,虽然std::string[](圆钉)与T(方孔)匹配,但它与T[](圆孔)匹配得更好。因此,T[]的部分模板专门化当模板参数为数组时选择。这两个选项从一开始就可用,并选择最佳选项。但为什么提供的类型(例如int[])本身不替换T?即,为什么它替换T+[]@barney将部分专门化视为模式匹配可能会有所帮助。您不向部分专门化提供参数,而是在主模板提供的参数与模式匹配时使用它。@t.C.因此,当我编写部分专门化并使用[]扩展类型t时或者*或者其他——它更倾向于将其作为模式匹配/我类型本身的元素进行审查?因此T[]不是[]到T的加法,对吗?(让我困惑的是,在语言的其他部分,我实际上可以向我的类型添加一些东西:
使用UniquePtr=std::unique_ptr的模板;
会将我原来的
UniquePtr
替换为
std::unique_ptr
有效地向类型添加一些东西,而不是用T+[]。这就像有一个方孔和一个直径相同的圆孔。可以将圆钉装入方孔中,但圆钉的最佳匹配是圆孔。因此,虽然std::string[](圆钉)与T(方孔)匹配,但它与T[](圆孔)匹配得更好。因此,T[]的部分模板专门化当模板参数为数组时选择。这两个选项从一开始就可用,并选择最佳选项。