假设我有一个具有一些专业化的类模板
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 R
与R
是相同的类型,但这并不意味着它具有匹配任何内容的限定符。(因此,不需要排序,因为这两个专门化是不相交的。
让我们看看发生了什么。
报表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>;?
当我们写时
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