首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >右值引用模板推导

右值引用模板推导
EN

Stack Overflow用户
提问于 2012-01-13 05:08:59
回答 2查看 575关注 0票数 4
代码语言:javascript
复制
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编译)

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

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-13 05:41:10

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

当传递类型为X cv&.的右值时,U的类型变为X.

  • when,传递类型为X的cv限定的左值,然后U变为X类型

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

票数 2
EN

Stack Overflow用户

发布于 2012-01-13 05:42:15

第一个变体

代码语言:javascript
复制
f(int(1)) <=> f<int>(int(1)) <=> U==int <=> is_same<int&&,int> == false

第二个变种

代码语言:javascript
复制
f<int&&>(int(1)) <=> U==int&& is_same<int&&,int&&> == true

像这样

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8842312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档