繁体   English   中英

使用rvalue / lvalue了解模板参数推导

[英]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)

第一个重载更严格,因为它需要少一个参数值的转换(即从doubleconst double )。

神奇的成分是“参考折叠” ,这意味着当T本身就是一个引用类型时, T &&可以是左值引用(具体而言, double & &&变为double & ,并且允许第一次演绎存在)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM