这里到底发生了什么?为什么这是一个错误?
void f(int &&);
int && i = 5;
f(i);
这不是有点违反直觉吗?
我希望i
成为左值引用,因此能够将其传递给f()
。但我得到一个错误;
没有已知从
的转换int
转换为int &&
所以我猜i
声明后不是右值参考?
答案 0 :(得分:27)
我明白你为何感到困惑。要记住的是,只要你有一个变量名,你就有一个 l-value 。
所以当你说:
Traceback (most recent call last):
File "/Users/liammitchell/Desktop/Comp Sci/Spirograph/spirograph.py", line 34, in <module>
main()
File "/Users/liammitchell/Desktop/Comp Sci/Spirograph/spirograph.py", line 30, in main
t_iterating(R, r, p)
File "/Users/liammitchell/Desktop/Comp Sci/Spirograph/spirograph.py", line 18, in t_iterating
turtle.goto(formulaX(R, r, p, t), formulaY(R, r, p, t))
File "<string>", line 1, in goto
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/turtle.py", line 1774, in goto
self._goto(Vec2D(*x))
TypeError: type object argument after * must be a sequence, not NoneType
还
int i = 0; // lvalue (has a name i)
那有什么区别?
int&& i = 0; // lvalue (has a name i)
只能绑定到 r值,所以:
int&&
<强> BUT 强>
int n = 0;
int i = n; // legal
<强>然而强>
int n = 0;
int&& i = n; // BAD!! n is not an r-value
因此,在此示例中将int&& i = 5; // GOOD!! 5 is an r-value
传递给i
时,您传递的是 l-value ,而不是 r-value :
f()
这种情况实际上比我在这里提出的要复杂一些。如果您对更全面的解释感兴趣,那么这个引用非常透彻:http://en.cppreference.com/w/cpp/language/value_category
答案 1 :(得分:19)
是和绑定之间的基本区别。例如:
void f(int &&);
声明一个接受一个参数的函数,该参数只能用对({type 1]}的{type convertible to}的rvalue引用进行初始化。
int
声明一个左值,它只能用对(可转换为)int && i = 5;
的类型的右值引用进行初始化。因此,简单来说,
int
尝试将对f(i);
的左值引用传递给仅接受int
的右值引用的函数。所以它没有编译。
告诉编译器将左值转换为右值,从而在适用的情况下使用移动构造函数(尽管不是int
),可以使用{{1} }。
int
答案 2 :(得分:16)
它有名字吗?
它可以解决吗?
如果两者的答案都是“是”,那么它就是L值。
在此代码段中:i
有一个名称,&i
有一个地址(您可以写f(&&)
),因此它是一个l值。
std::move
将r值引用作为参数,因此您需要将l值转换为r值引用,这可以使用f(std::move(i));
来完成。
NSData *photoData= [[Appdelegate appdelegateobject ]xmppvCardAvatarModule] photoDataForJID:jid];
UIImage *img=[UIImage imageWithData:data];