void foo(string&& bar){ string* temp = &bar; cout << *temp << " @:" << temp << endl; }
是酒吧的价值还是价值?
我问,因为我显然不能采取一个rvalue的地址,但我可以采取一个rvalue引用的地址,在这里完成.
如果您可以对一个左值参考进行任何操作,您可以通过左值参考来区分两者与“&&”之间的区别而不是只是一个“&”?
解决方法
Is
bar
an rvalue or an lvalue?
问题回答自己.无论什么名称都是一个左派(1).所以吧是一个左派.它的类型是“rvalue reference to string”,但它是该类型的左值.
如果你想把它当作一个rvalue,你需要应用std :: move()到它.
If you can perform any operation on an rvalue reference that you can on an lvalue reference what is the point in differentiating between the two with the “&&” instead of just an “&”?
这取决于您对“执行操作”的定义.一个左值引用和一个(命名的)rvalue引用在表达式中如何使用它们几乎相同,但是它们在绑定到它们上有很大的不同. Lvalues可以绑定到lvalue引用,rvalue可以绑定到rvalue引用(和任何可以绑定到一个lvalue引用const).也就是说,您不能将rvalue绑定到lvalue引用,反之亦然.
我们来讨论一个rvalue引用类型的函数参数(比如你的吧).重要的一点不是什么吧,而是你所知道的关于酒吧所指的价值.因为酒吧是一个价值参考,所以你肯定知道,无论如何,它都是一个价值.这意味着当完整的表达式结束时,它必将被破坏,您可以将其安全地视为价值(通过窃取其资源等).
如果您不是直接进行此操作的人,而只是想通过酒吧,您可以选择两个选项:或者您已经完成了酒吧,然后您应该告诉下一个收到该消息的用户将其绑定到rvalue-do std :: move(bar).或者你需要使用bar来做更多的事情,所以你不希望任何人在中间窃取你的资源,所以只把它视为一个左值吧.
总结一下:一旦你拥有这个参考,差异就不在于你可以做什么.区别在于可以绑定到引用.