c – R值参考被视为一个左值?

c – R值参考被视为一个左值?,第1张

概述我发布了这个答案: https://stackoverflow.com/a/28459180/2642059其中包含以下代码: void foo(string&& bar){ string* temp = &bar; cout << *temp << " @:" << temp << endl;} 是酒吧的价值还是价值? 我问,因为我显然不能采取一个rvalue的地址,但我可以 我发布了这个答案: https://stackoverflow.com/a/28459180/2642059其中包含以下代码:
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来做更多的事情,所以你不希望任何人在中间窃取你的资源,所以只把它视为一个左值吧.

总结一下:一旦你拥有这个参考,差异就不在于你可以做什么.区别在于可以绑定到引用.

(1)一个很好的经验法则,除了少数例外:枚举者有名称,但是是右值.类,命名空间和类模板都有名称,但不是值.

总结

以上是内存溢出为你收集整理的c – R值参考被视为一个左值?全部内容,希望文章能够帮你解决c – R值参考被视为一个左值?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1254116.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存