【问题标题】:rvalue reference template deduction右值引用模板推导
【发布时间】:2012-01-13 05:54:39
【问题描述】:
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&lt;int&amp;&amp;&gt;时,为什么v参数被解释为int? 有什么区别 ? (MVS2010编译)

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

谢谢。

【问题讨论】:

    标签: c++ templates rvalue-reference


    【解决方案1】:

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

    • 当传递X 类型的右值时,U 的类型变为X
    • 当传递X 类型的cv 限定左值时,U 变为X cv&amp; 类型。

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

    【讨论】:

    • 关于你的最后一部分答案:这就是为什么如果你还定义了一个模板f(U u){},代码由于不明确的调用而无法编译。跨度>
    【解决方案2】:

    第一个变体

    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
    

    这样

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多