右值参考模板推导
rvalue reference template deduction
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 heren"; //only with f<int&&>(int(1));
}
}
int main()
{
f(int(1));
f<int&&>(int(1));
std::cin.ignore();
}
为什么 v 参数在我没有明确使用 f<int&&>
时被解释为 int
?有什么区别?(与MVS2010一起编译(
我的猜测是,第一个作为右值传递,第二个作为右值引用传递,并且两者都正确绑定到右值引用中,对吗?
谢谢。
不,不是真的。永远不会推断出右值引用。U
是可推导模板参数U&&
的概念用于指示应推导U
,以便保留参数的右值性:
- 传递类型
X
的右值时,U
的类型变为X
。 - 当传递 CV 合格的
X
类型的左值时,U
成为类型X cv&
。
更有趣的问题是在第二次调用中显式指定的右值引用发生了什么,因为没有进行扣除,因为在这种情况下,两个右值引用被折叠为一个。
第一个变体
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
喜欢这个
相关文章:
- 通用参考 l 值不复制对象
- 是否有必要使用 std::move?这不是已经是一个右值参考了吗?
- Lambda闭包左值可以作为右值参考参数传递
- 如何获取地图值的参考?
- 演绎指南中的参考文献和值之间的差异
- 赋值运算符的返回值可以作为参考吗?
- 如果值来自成员变量,则复制初始化和参考初始化之间的C 差异
- 超载函数既不按值,也不是通过参考来对象,而是将撤销的指针换成对象
- 移动 l 值参考参数是否是一种不好的做法?
- C 按值返回与参考返回
- 为什么未调用具有常量参考返回值的超载方法
- 是否有一种方法可以始终通过值(制作副本)而不是在使用类成员函数时通过参考来传递
- 作为RVALUE参考与双移动值的传递
- 可以std ::移动引起切片时切入L值参考
- 为什么通用参考和右值参考的流量不同
- 提供功能版本,其中可用值和参考
- 通过值和参考,对象构建返回对象之间的区别
- 按值传递参考参数
- C 模板函数基于参数是值还是参考
- 使用具有默认值的参考参数是一种良好的做法