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引用中,对吗?
谢谢。
发布于 2012-01-13 05:41:10
不,不是真的。右值引用永远不会被推导出来。将U作为可推断模板参数的U&&概念用于指示应推导U,以便保留参数的右值:
当传递类型为X cv&.的右值时,U的类型变为X.
X的cv限定的左值,然后U变为X类型更有趣的问题是在第二次调用中显式指定的rvalue引用发生了什么,因为没有进行演绎,因为在这种情况下,两个rvalue引用被折叠为一个引用。
发布于 2012-01-13 05:42:15
第一个变体
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像这样
https://stackoverflow.com/questions/8842312
复制相似问题