c++ - 为什么文字和临时变量不是左值?
问题描述
我读过那些lvalues
是“具有定义存储位置的东西”。
此外,文字和临时变量不是左值,但没有给出此声明的理由。
是因为文字和临时变量没有定义存储位置吗?如果是,那么如果不在内存中,它们会驻留在哪里?
我想“定义的存储位置”中的“定义”有一定的意义,如果有(或没有)请告诉我。
解决方案
此外,文字和临时变量不是左值,但没有给出此声明的理由。
除字符串文字外,所有临时和文字都是如此。这些实际上是左值(如下所述)。
是因为文字和临时变量没有定义存储位置吗?如果是,那么如果不在内存中,它们会驻留在哪里?
是的。文字2
实际上并不存在。它只是源代码中的一个值。因为它是一个值,而不是一个对象,所以它不必有任何与之关联的内存。它可以硬编码到编译器创建的程序集中,也可以放在某个地方,但由于它不是必须的,你所能做的就是把它当作一个纯值,而不是一个对象。
不过有一个例外,那就是字符串文字。这些实际上具有存储空间,因为字符串文字是const char[N]
. 您可以获取字符串文字的地址,并且字符串文字可以衰减为指针,因此它是左值,即使它没有名称。
临时变量也是右值。即使它们作为对象存在,它们的存储位置也是短暂的。他们只会持续到他们所在的完整表达结束。你不能接受他们的地址,他们也没有名字。它们甚至可能不存在:例如,在
Foo a = Foo();
Foo()
可以删除并且代码在语义上转换为
Foo a(); // you can't actually do this since it declares a function with that signature.
所以现在优化代码中甚至没有临时对象。
推荐阅读
- python-3.x - 请求:在没有 GET 的情况下检索最终 URL 重定向
- java - 无法理解为什么 Java 和 Scala 的下界表现不同
- api - 使用 twurl 从特定用户获取最新推文
- mysql - C# 连接到 Docker Mysql 容器
- python - pandas to_excel not working with pyinstaller
- typescript - use a computed property for an indexer in typescript
- python - python pandas aggregate transaction data into timeframes by customer
- javascript - Javascript:使用相同的键合并数组中的对象不起作用
- kubernetes - Kubernetes:如何在 distroless 容器上模拟活性探测?
- apache-kafka - Mirrormaker 2 是否需要第三个 kafka 来进行镜像操作?