传递int&&到f(int&&)

时间:2016-02-10 11:35:13

标签: c++ c++11

这里到底发生了什么?为什么这是一个错误?

void f(int &&);

int && i = 5;

f(i);

这不是有点违反直觉吗?

我希望i成为左值引用,因此能够将其传递给f()。但我得到一个错误;

  

没有已知从int转换为int &&

的转换

所以我猜i声明后不是右值参考?

3 个答案:

答案 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];