c++ - 右值引用模板推导

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

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

我的猜测是,First 作为右值传递,second 作为右值引用传递,并且都正确绑定(bind)到右值引用,对吗?

谢谢。

最佳答案

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

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

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

关于c++ - 右值引用模板推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8842312/

相关文章:

c++ - 创建的事件数量有限制吗?

c++ - 功能与安全/静态与动态实例化

Outlook 表格宽度问题中的 HTML 电子邮件 - 内容比指定的表格宽度宽

c++ - 右值在不使用 std::move 的情况下导致警告

具有不同类型的非类型参数的 C++ 可变参数模板

c++ - 扩展类而不更改其名称

c++ - std::thread 构造函数?特化?。 g++ 与 clang++

c++ - 接受所有版本的 const/volatile 限定和 & vs && 的类模板特化

c++ - "doesn' t synthesize"和 "defined as deleted"有什么区别?

c++ - 从非本地返回一个右值引用