hiv*_*ert 8 c++ templates rvalue lvalue c++11
让我们玩下面的代码:
#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);
}
Run Code Online (Sandbox Code Playgroud)
它打印:
in lvalue
in rvalue
Run Code Online (Sandbox Code Playgroud)
我不明白第二次电话会发生什么.编译器如何解析模板参数?为什么没有歧义?
Ker*_* SB 13
当你说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)
Run Code Online (Sandbox Code Playgroud)
第一过载是严格更好,因为它需要(即从参数值中的一个较少转换double
到const double
).
神奇的成分是"参考折叠",这意味着T &&
当T
它本身就是一个引用类型时可以是左值引用(具体地,double & &&
变为double &
,并且允许第一个推论存在).