了解使用右值/左值的模板参数推导

2024-03-21

这是来自的后续函数模板无法识别左值 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(使用前将#替换为@)

了解使用右值/左值的模板参数推导 的相关文章

随机推荐