右值参考模板推导

rvalue reference template deduction

本文关键字:值参 参考      更新时间:2023-10-16
template<class U>
void f( U && v)
{     
    std::cout << typeid(v).name() << "n"; //'int' in both cases
    if( boost::is_same<int&&,U>::value )
    {
        std::cout << "reach heren"; //only with f<int&&>(int(1));
    }
}

int main()
{    
    f(int(1));
    f<int&&>(int(1));
    std::cin.ignore();
}

为什么 v 参数在我没有明确使用 f<int&&> 时被解释为 int?有什么区别?(与MVS2010一起编译(

我的猜测是,第一个作为右值传递,第二个作为右值引用传递,并且两者都正确绑定到右值引用中,对吗?

谢谢。

不,不是真的。永远不会推断出右值引用。U是可推导模板参数U&&的概念用于指示应推导U,以便保留参数的右值性:

  • 传递类型 X 的右值时,U的类型变为 X
  • 当传递 CV 合格的 X 类型的左值时,U 成为类型 X cv&

更有趣的问题是在第二次调用中显式指定的右值引用发生了什么,因为没有进行扣除,因为在这种情况下,两个右值引用被折叠为一个。

第一个变体

f(int(1)) <=> f<int>(int(1)) <=> U==int <=> is_same<int&&,int> == false

第二种变体

f<int&&>(int(1)) <=> U==int&& is_same<int&&,int&&> == true

喜欢这个