首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rvalues vs temporaries

Rvalues vs temporaries
EN

Stack Overflow用户
提问于 2010-07-09 22:30:26
回答 3查看 319关注 0票数 1

有人概括了"Temporaries are rvalues“这句话。我说“不”,并给了他下面的例子

代码语言:javascript
复制
 double k=3;

 double& foo()
 {
    return k;
 }

 int main()
 {

     foo()=3; //foo() creates a temporary which is an lvalue
 }

我的解释正确吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-09 22:57:30

临时性和右值是不同的(但相关的)概念。临时性是对象的一个属性。非临时对象的例子有局部对象、全局对象和动态创建的对象。

作为右值是表达式的一个属性。与右值相对的是左值,如名称或取消引用的指针。“临时是右值”这句话是没有意义的。下面是rvalue和临时对象之间的关系:

右值是一个表达式,它的计算结果创建了一个临时对象,该对象在包含右值的完整表达式的末尾被销毁。

注意,左值也可以表示临时对象!

代码语言:javascript
复制
void blah(const std::string& s);

blah(std::string("test"));

在函数blah中,左值s表示通过计算表达式std::string("test")创建的临时对象。

你的评论“引用是左值”也是没有意义的。引用不是表达式,因此不能是左值。你真正的意思是:

如果函数返回引用,则表达式function()为左值。

票数 9
EN

Stack Overflow用户

发布于 2010-07-09 22:31:49

不是的。您返回的是对全局双精度值的引用,而不是临时引用。

使用真正的临时变量进行相同的测试是:

代码语言:javascript
复制
double foo() { return 3.0; }
int main() {
   foo() = 2.0; // error: lvalue required as left operand of assignment
}

编辑:答案只是为了确认这个例子是错误的,我并不是真的想深入讨论临时值是否正确……正如其他人所说,lvalue-ness或rvalue-ness是表达式的属性,而不是对象的属性(在最一般的意义上,不仅仅是类实例)。话又说回来,标准说:

§3.10/5调用不返回引用的函数的结果是右值。用户定义的运算符是函数,这些运算符是否期望或产生左值取决于它们的参数和返回类型。

§3.10/6包含从强制转换到非引用类型产生的临时对象的表达式是右值(这包括使用函数表示法(5.2.3)显式创建对象)。

哪些AFAIK是创建临时文件的环境。现在,您还可以将常量引用绑定到临时对象,在这种情况下,您将获得一个新的变量(引用),该变量可用作有效引用临时对象的左值。

细微之处在于创建临时对象的表达式是右值表达式。可以将常量引用绑定到该表达式的结果,以获得可用作常量限定左值表达式的变量。

票数 7
EN

Stack Overflow用户

发布于 2010-07-10 00:38:16

临时值一直受到保护,不会变成左值,所以现在被称为右值。但是多亏了移动语义,C++0x将允许临时变量变成左值。就像在这个愚蠢的片段中

代码语言:javascript
复制
void blah(ICanBeTemporary && temp)
{
    temp.data = 2; //here temporary becomes lvalue
}


//somewhere
blah(ICanBeTemporary("yes I can"));

现在我们有了混乱的术语。人们习惯于将临时值称为rvalue,这被称为rvalue引用。命名对象现在被认为是非右值引用的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3213591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档