[英]Understanding template argument deduction with rvalue/lvalue
让我们玩下面的代码:
#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 &&)
和func(const double &)
。 前者不可行,因为右值引用不能绑定到左值(即n
)。
只有func(n)
执行参数推导。 这是一个复杂的主题,但简而言之,您有两个可能的候选人:
T = double &: func(T &&) --> func(double &) (first overload)
T = double: func(const T &) --> func(const double &) (second overload)
第一个重载更严格,因为它需要少一个参数值的转换(即从double
到const double
)。
神奇的成分是“参考折叠” ,这意味着当T
本身就是一个引用类型时, T &&
可以是左值引用(具体而言, double & &&
变为double &
,并且允许第一次演绎存在)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.