这是来自的后续函数模板无法识别左值 https://stackoverflow.com/questions/22166767/template-function-does-not-recognize-lvalue/22166879#22166767
让我们玩一下下面的代码:
#include <iostream>
template <class T>
void func(T&&) {
std::cout<<"in rvalue\n";
}
template <class T>
void func(const T&) {
std::cout<<"in lvalue\n";
}
int main()
{
double n=3;
func<double>(n);
func(n);
}
它打印:
in lvalue
in rvalue
我不明白第二次通话发生了什么。编译器如何
解析模板参数?为什么没有任何歧义?
当你说func<double>(n)
,没有参数推导,因为您指定了参数,所以选择是func(double &&)
and func(const double &)
。前者不可行,因为右值引用无法绑定到左值(即n
).
Only func(n)
执行参数演绎。这是一个复杂的主题,但简而言之,有以下两个可能的候选者:
T = double &: func(T &&) --> func(double &) (first overload)
T = double: func(const T &) --> func(const double &) (second overload)
第一个重载严格来说更好,因为它需要更少的参数值转换(即从double
to const double
).
神奇的成分是“参考崩溃” https://stackoverflow.com/a/13032925/596781, 意思就是T &&
可以是左值引用,当T
本身就是一个引用类型(具体来说,double & &&
变成double &
,这使得第一个推论存在)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)