1
4
< Buff行情>
此外,文本和临时变量不是lvalues,但没有为此语句给出任何理由。 < /块引用> 除字符串文本外,所有临时文本和文本都是如此。这些实际上是lvalues,解释如下。 < Buff行情> 是因为文本和临时变量没有定义存储位置吗?如果是,那么如果不在内存中,它们将驻留在哪里? < /块引用> 是的。文字
2
实际上不存在,它只是源代码中的一个值。因为它不是一个对象,它是一个值,所以它不必有任何相关的内存。它可以硬编码到编译器创建的程序集中,也可以放在某个地方,但是由于它不需要你做的所有事情,所以你可以把它当作一个纯粹的值,而不是一个对象。
但是有一个例外,那就是字符串文本。因为字符串文字是
临时工也是临时工。即使对象存在,其存储位置也是短暂的。它只能持续到它们所在的完整表达式结束。你不能带他们的地址,他们也没有名字。例如,它们甚至可能不存在于
所以现在优化后的代码中甚至没有临时对象。
|
2
5
< Buff行情>
为什么文本和临时变量不是lvalue? < /块引用>我有两个答案:因为它没有意义(1),因为标准是这么说的(2)。让我们专注于(1)。 < Buff行情>是因为文本和临时变量没有定义存储位置吗? < /块引用>这是一个不适合这里的简化。简化:文字和临时值不是lvalues,因为修改它们是没有意义的。
什么意思
f(MyType{}.mutate())
一方面
f(my_int + 1)
另一方面。我认为简化仍然是
MyType{}.mutate()
可以被视为
MyType{}
是,像
my_int + 1
可以被视为
int
作为
my_int
是。这都是基于语义和观点的。真正的答案是:(2)因为标准规定是这样的。
|
3
3
< Buff行情>
如果不在记忆中,它们会住在哪里? < /块引用>当然,它们存在于内存中,这是不可能的。问题是,您的程序能否确定它们在内存中的确切位置。换言之,您的程序是否允许获取相关内容的地址。
在一个简单的例子中
请注意,字符串文本是“非左值”规则的例外,因为
但是,它可能不一定是数据。事实上,它们甚至不可能被表示为程序内存中的常量:例如,赋值
short a; a = 0xFF00
可以表示为
0xFF
在上八位字节中,清除内存中的下八位字节。
|
4
2
还使用了“定位器值”一词 here < Buff行情>C C编程语言遵循类似的分类法,除了 分配的作用不再重要:C表达式 在“左值表达式”和其他表达式(函数和 非对象值),其中“lvalue”表示标识 一个对象,一个“定位器值”[4]。 < /块引用>
不是
|
apetrai · 我应该如何假设算法使用哪种迭代器类别? 2 年前 |
ridiculous_fish · std::是否保证短路? 2 年前 |
Fabio · 在c中将指针赋给常数指针++ 2 年前 |
johnco3 · 初始化固定C数组成员结构 6 年前 |
mans · 为什么出现此错误:constexpr在此处无效 6 年前 |
juztcode · 在C++中尝试捕获-创建了多少个对象 6 年前 |
Steven Scott · 忽略元素的基于范围的for循环 6 年前 |