首页 > 解决方案 > 为什么文字和临时变量不是左值?

问题描述

我读过那些lvalues是“具有定义存储位置的东西”。

此外,文字和临时变量不是左值,但没有给出此声明的理由。

是因为文字和临时变量没有定义存储位置吗?如果是,那么如果不在内存中,它们会驻留在哪里?

我想“定义的存储位置”中的“定义”有一定的意义,如果有(或没有)请告诉我。

标签: c++c++11rvaluelvalue

解决方案


此外,文字和临时变量不是左值,但没有给出此声明的理由。

除字符串文字外,所有临时和文字都是如此。这些实际上是左值(如下所述)。

是因为文字和临时变量没有定义存储位置吗?如果是,那么如果不在内存中,它们会驻留在哪里?

是的。文字2实际上并不存在。它只是源代码中的一个值。因为它是一个值,而不是一个对象,所以它不必有任何与之关联的内存。它可以硬编码到编译器创建的程序集中,也可以放在某个地方,但由于它不是必须的,你所能做的就是把它当作一个纯值,而不是一个对象。

不过有一个例外,那就是字符串文字。这些实际上具有存储空间,因为字符串文字是const char[N]. 您可以获取字符串文字的地址,并且字符串文字可以衰减为指针,因此它是左值,即使它没有名称。

临时变量也是右值。即使它们作为对象存在,它们的存储位置也是短暂的。他们只会持续到他们所在的完整表达结束。你不能接受他们的地址,他们也没有名字。它们甚至可能不存在:例如,在

Foo a = Foo();

Foo()可以删除并且代码在语义上转换为

Foo a(); // you can't actually do this since it declares a function with that signature.

所以现在优化代码中甚至没有临时对象。


推荐阅读