右值参考模板扣除

时间:2012-01-12 21:08:59

标签: c++ templates rvalue-reference

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 here\n"; //only with f<int&&>(int(1));
    }
}


int main()
{    
    f(int(1));

    f<int&&>(int(1));

    std::cin.ignore();
}

为什么当我没有明确使用int时,v参数被解释为f<int&&>? 有什么不同 ? (用MVS2010编译)

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

感谢。

2 个答案:

答案 0 :(得分:2)

不,不是真的。永远不会推导出右值参考。使用U&&作为可推导模板参数的概念U用于表示应推导出U,以便保留参数的右值:

  • 在传递X类型的左值时,U的类型变为X
  • 传递类型为X cv 合格左值时,U成为X cv&类型。

更有趣的问题是在第二次调用中明确指定的rvalue引用发生了什么,因为没有进行推导,因为在这种情况下,两个右值引用只折叠成一个。

答案 1 :(得分:1)

第一个变种

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

喜欢这个