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/