为什么返回的对象是右值
Why is returned object an rvalue?
class A {}
A foo() {
A a;
// some work
return a;
}
这里它返回一个A
的实例,我看到很多读数说这返回了一个rvalue
。
我的困惑是,由于做A b; a = b;
是完全合法的,变量a
似乎是一个lvalue
。那么,为什么当它是返回的时,它会变得rvalue
呢?
没有右值对象这样的东西。
右值和左值是指表达式。
一个引用对象的表达式可以是右值,而另一个引用同一对象的表达式可以是左值。
最初"左值"是指任何可以在C =
左侧的表达式,而"右值"是任何只能在右侧的表达式。从那以后,C++获得了const
和参考资料,事情变得复杂了。但是早期的C观点对于理解这一点是有用的。
关于。。。
"> 变量
a
似乎是一个左值。那么,为什么当它是返回的时,它会变成右值呢?
好吧,变量本身不是一个左值。表达式a
是一个左值。并且该函数不返回变量:它返回变量的值。
因此,据我了解,这个问题涉及两个误解:
左值/右值是关于对象的想法。这是关于表达的。
A foo() { return... }
返回对对象的引用的想法(例如在Java中(。它返回一个值。
lvalue
是一个引用内存位置的表达式,并允许我们通过 & 运算符获取该内存位置的地址。rvalue
是不是lvalue
的表达式。
看这里 http://thbecker.net/articles/rvalue_references/section_01.html
在您的示例中,您将返回堆栈分配实例的副本。但这也可能在堆栈上,并且是"临时副本",因此您无法获取它的地址。因此它不是一个lvalue
,所以它是一个rvalue
相关文章:
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 如何访问从 COM 对象返回的 VARIANT 数据类型中的安全数组C++?
- 从我的对象返回静态数组
- 将unique_ptr作为<Object>unique_ptr<常量对象返回>
- 从右值对象返回成员
- 视觉对象 返回 C++ 中的双精度值
- 为什么类型为 sf::Text 的对象返回不同的 getPosition().y 和 getLocalBounds().
- std::min_element 从类对象返回意外结果
- C++无效的对象返回语义
- const引用是否延长临时对象返回的临时对象的寿命
- 将 NULL 作为对象返回时未收到任何警告
- 如何在 C# 中从 com 对象返回数组(double[])
- 从重载运算符返回引用,并使用临时对象返回表达式
- Cin 对象返回值 c++
- 将变量作为类对象返回
- 使用可更改对象返回只读的最佳方法是什么
- 如何在Cython中从另一个包装对象返回包装的c++对象
- 当对象返回时,c++动态数组被清除
- 从带有动态字段的函数、对象返回
- 从堆栈上的匿名对象返回对*this的引用