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();
}
为什么当我没有明确使用int
时,v参数被解释为f<int&&>
?
有什么不同 ? (用MVS2010编译)
我的猜测是,First作为右值传递,第二个作为右值参考传递,并且两者都正确绑定到右值参考中,我是对的吗?
感谢。
答案 0 :(得分:2)
不,不是真的。永远不会推导出右值参考。使用U&&
作为可推导模板参数的概念U
用于表示应推导出U
,以便保留参数的右值:
X
类型的左值时,U
的类型变为X
。X
的 cv 合格左值时,U
成为X cv&
类型。更有趣的问题是在第二次调用中明确指定的rvalue引用发生了什么,因为没有进行推导,因为在这种情况下,两个右值引用只折叠成一个。
答案 1 :(得分:1)
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
喜欢这个