模板专业化中cv限定符与指针/引用的部分排序



假设我有一个具有一些专业化的类模板

template<typename T> struct A {};
template<typename T> struct A<T const> {};
template<typename T> struct A<T &> {};

当我实例化A<const int&>时,哪个专业化具有优先权?

我用GCC运行了一个测试,它选择了int&专业化。我想这是规则,但我找不到这是怎么说的。

编辑:考虑到const int&const T匹配T=int&,我犯了一个错误,因为模板不仅仅是一个"模板";宏替换";。特别是,谈论const引用(仅引用const(毫无意义。目前的两个答案都帮我弄清楚了。不幸的是,我只能选择一个作为公认的答案,但谢谢你们两个。

X&const Y永远不能是相同类型的分解,因为引用不能是const限定的。(给定using R=T&;const RR是相同的类型,但这并不意味着它具有匹配任何内容的限定符。(因此,不需要排序,因为这两个专门化是不相交的。

让我们看看发生了什么。

报表1

template<typename T> struct A {}; //primary template

上面显示的语句定义了主模板。这意味着它可以用于任何类型

报表2

template<typename T> struct A<T const> {};//specialized for T const

上面的语句是主模板的专门化。这意味着,我们专门针对T const。也就是说,这种专门化将用于具有顶级const的模板参数。

报表3

template<typename T> struct A<T &> {};//specialized for T&

这一次,我们专门化表单T&的模板参数的主模板。也就是说,我们正在专门化左值引用的主要模板。此外,左值引用可以是常量的引用,也可以是非常量的引用这意味着,此专门化将用于所有左值引用(T&const T&(。

现在让我们回到你的问题:

当我实例化A<const int&gt;?

当我们写时

A<const int&>

由于我们已经有了lvalue引用的规范,这个特定的规范被使用,正如我在语句3的解释中所解释的那样。

更多示例

const int i = 5;
A<decltype(i)> p;//this will use the T const specialization since the template argument has a top level const

最新更新