Leo*_*sky 6 c++ templates overriding partial-ordering
为什么这个含糊不清?
template<class T> void g(T) {} // 1
template<class T> void g(T&) {} // 2
int main() {
int q;
g(q);
}
Run Code Online (Sandbox Code Playgroud)
我知道这是部分订购的背景.而我的,可能是错误的想法是:任何来自#2的T都可以放在#1中,但#1中的任何T都不是#2中的合法.所以部分排序应该有效.
好.我想这就是你要找的东西.没有深入参与参数与参数类型比较的两次应用,标准中的以下内容跳出来:
C++11§14.8.2.4p5
在完成部分排序之前,对用于部分排序的类型执行某些转换:
- 如果P是参考类型,则P被所指的类型替换.
- 如果A是引用类型,则A将被引用的类型替换.
C++11§14.8.2.4p6继续讨论当两者都是引用类型时会发生什么,但这在这里不适用(尽管也是一个有趣的读物).在你的情况下,只有一个,所以它被剥离.从那里:
C++11§14.8.2.4p7
删除所有顶级cv限定符:
- 如果P是cv限定类型,则P由cv非限定版本的P替换.
- 如果A是cv限定类型,则A替换为cv非限定版本的A.
现在两者完全相同,因此你有歧义,我相信这是从C++11§14.8.2.4p10中巩固的.C++11§14.8.2.4p9的文本涵盖了两种引用类型,这里的情况并非如此:
C++11§14.8.2.4p10
如果对于每种类型被认为是给定的模板至少对所有类型都是专用的,并且对于某些类型更专用,而另一个模板对于任何类型都不是更专用的,或者至少不是对任何类型的专用,那么给定的模板比其他模板更专业.否则,两个模板都不比另一个更专业.
但阅读本节中的标准就像是破译希腊给我,所以我可能方式关闭基地.(希腊人没有违法行为= P).
然而,它确实让我觉得" const T&反对a T,在给定相同的调用条件的情况下g(q),如果我刚刚阅读的所有内容都按照书面形式执行,那么它也应该是模棱两可的".果然,我试了一下,同样含糊不清.
| 归档时间: |
|
| 查看次数: |
177 次 |
| 最近记录: |