模板专业化中 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 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&
形式的模板参数的主要模板。也就是说,我们专门针对左值引用的主要模板。此外,左值引用可以是对 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
假设我有一个 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 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&
形式的模板参数的主要模板。也就是说,我们专门针对左值引用的主要模板。此外,左值引用可以是对 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