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

前端之家收集整理的这篇文章主要介绍了c – R值参考被视为一个左值?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我发布了这个答案: 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&C++相关文章