我这里有一个非常简单的函数定义:
void testRvalue(int&& r)
{
printf("rvalue ref is called\n");
testRvalue(r); // this line gives "no known conversion from 'int' to 'int &&' for 1st argument"
}
我的意思是在这个函数内部,什么是类型r
?不是吗int&&
(参数是int&& r
那么怎么会r
不属于类型int&&
?)如果是的话为什么我不能通过这个r
对于这个函数本身,它需要一个int&&
类型作为参数?
是什么类型的r
确切地?int&&
or int
? If int
, why?
一本很好的读物是价值类别.
是的,变量的类型r
确实是int&&
。然而这里重要的是表达方式 and:
每个 C++ 表达式(一个运算符及其操作数、一个文字、一个
变量名等)由两个独立的属性来表征:a
类型和值类别。每个表达式都有一些非引用
类型,并且每个表达式恰好属于三个表达式之一
主要值类别:右值、x值和左值。
表达方式r
是一个左值:
lvalue
以下表达式是左值表达式:
- 变量的名称 [...],无论类型如何。即使变量的类型是右值引用,由其组成的表达式
name 是一个左值表达式;
右值引用可以绑定到纯右值或x值,但不能绑定到左值,因此如果您想将右值引用绑定到r
你需要转换r
到 x 值。这是用完成的std::move尽管它的名字只是一个演员阵容。
您可以很容易地这样推理:如果它有一个名称,那么它就是一个左值(即使该 id 的类型是右值引用)。您不能将右值引用(原则上应该绑定到临时对象)绑定到具有名称的对象。有名称的东西可以重复使用。你需要std::move
to 启用移动从那个左值。
关于“没有已知的‘int’转换”消息。如上所示表达式的类型r
is int
,但是更合适的诊断消息应该是这样的:“右值引用无法绑定到左值”。
事实上,较新的 clang 和 gcc 给出了更好的消息:
gcc
错误:无法将“int&&”类型的右值引用绑定到“int”类型的左值
clang
候选函数不可行:第一个参数需要右值
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)