模板专业化中 cv 限定符的部分排序与 pointer/reference

Partial ordering of cv qualifiers vs pointer/reference in template specialization

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

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& 形式的模板参数的主要模板。也就是说,我们专门针对左值引用的主要模板。此外,左值引用可以是对 const 的 引用或对非 const 引用。 这意味着,这个特化将用于所有左值引用(T&const T&)。

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

Which specialization has the precedence, when I instantiate A<const int&>?

当我们写作时

A<const int&>

然后因为我们已经有了左值引用的规范化,我已经在语句 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