L-value-ref的部分排序

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中的合法.所以部分排序应该有效.

Who*_*aig 7

好.我这就是你要找的东西.没有深入参与参数与参数类型比较的两次应用,标准中的以下内容跳出来:

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),如果我刚刚阅读的所有内容都按照书面形式执行,那么它也应该是模棱两可的".果然,我试了一下,同样含糊不清.

  • @MatthieuM.嘿嘿.阅读§14.8.2.4p8,p12处理参数包部分排序.之后我需要喝一杯烈酒和一支香烟. (4认同)