C++ 模板 - 完整指南 http://www.tmplbook.com/,在§C.1中,读取
- 执行重载解析以找到best候选人。如果有则选择;否则,调用是不明确的。
然后,在§C.2中,对可能的匹配(给定参数与可行候选的相应参数)进行排序,如下所示(我的emphasis):
- 完美搭配。参数具有表达式的类型,或者它的类型是对表达式类型的引用 (可能添加
const
and/or volatile
预选赛)。
- 进行细微调整的匹配。例如,这包括将数组变量衰减为指向其第一个元素的指针或添加
const
匹配类型的参数int**
到一个类型的参数int const* const*
.
- 与促销相匹配。 ……
- 仅与标准转换匹配。 ……
- 与用户定义的转换匹配。 ……
- 与省略号匹配 (
...
). …
现在,从最高层开始const
按值参数不是函数签名的一部分,我认为第一点括号中的部分指的是参数是对表达式类型的引用的情况。如果我的解释是正确的,那就意味着T const&
参数与类型参数完美匹配T
.
毕竟,在 §C.2.2 中,我看到这一点得到了证实:
对于类型的参数X
,构成完美匹配的常见参数类型有四种:X
, X&
, X const&
, and X&&
(X const&&
也是完全匹配,...)
然后,本书继续提供一些示例,展示参数的类别值如何确定选择什么重载。
但如果所有的X
, X&
, X const&
, X&&
, and X const&&
是完美匹配,那么什么时候根据参数的值类别首选其中之一?
这不是重载解析的一部分吗?如果是这样,为什么上述几点中根本没有提到价值类别?
为什么上面几点中根本没有提到价值类别?
书中提到了这一点,如下所示。特别是,如果您继续阅读下去,您会发现C.2.2节 titled 完善完美搭配确实提到了区分不同完美匹配的部分:
随着 C++11 中添加右值引用,需要区分两个完全匹配的另一种常见情况下面的例子说明了这一点:
struct Value {
...
};
void pass(Value const&); // #1
void pass(Value&&);// #2
void g(X&& x)
{
pass(x); // calls #1 , because x is an lvalue
pass(X()); // calls #2 , because X() is an rvalue (in fact, prvalue)
pass(std::move(x)); // calls #2 , because std::move(x) is an rvalue (in fact, xvalue)
}
这次,采用右值引用的版本被认为与 RVALUES 更好匹配,但它不能匹配左值。
请注意上面引用的示例中的粗体部分。
同样,它甚至还有以下示例:
void report(int&); // #1
void report(int const&); // #2
int main()
{
for (int k = 0; k<10; ++k) {
report(k); // calls #1
}
report(42); // calls #2
}
这里,LVALUES 首选不带额外 const 的版本,而只有带有 const 的版本才能匹配 RVALUES。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)