繁体   English   中英

右值参考模板扣除

[英]rvalue reference template deduction

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();
}

当我没有显式使用f<int&&>时,为什么v参数被解释为int 有什么区别 ? (用MVS2010编译)

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

谢谢。

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

  • 当传递类型X的右值时, U的类型变为X
  • 当传递类型Xcv限定左值时,则U成为类型X cv&

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

第一个变种

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

像这样

暂无
暂无

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

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