![]() |
1
108
至少这是按惯例实施这些运营商的“正常”方式。所有内置类型都是这样工作的。如果你读过关于左值/右值的内容,你会发现由于前缀运算符返回命名对象本身,它将是一个左值,其中作为后缀运算符返回一个本地临时值的副本,然后它将被限定为一个右值。 注:还有,我们现在有prvalues,xvalues等等,所以现在技术上比较复杂。看 here for more info. |
![]() |
2
45
C++(与C相反)是一个专门的 保留左值 语言:只要有可能,它都会努力保持表达式的“左值”。
这就是为什么C++利用容易实现的机会来保持预增量的“轻量级”,但承认在后增量中实现同样的可能性是不可能的。在后增量的情况下,偏离经典的标准c行为是不值得的,它倾向于快速愉快地抛弃“左值性”。 |
![]() |
3
29
也许用伪代码写下
前缀:
后缀:
区别在于两个运算符返回的内容,一个是值,一个是引用。 |
![]() |
4
14
我猜这是一个价值,因为它可以。
或
评估是有意义的
因为它不能是一个左值。
或
|
![]() |
5
11
对于内置类型
,如
在C中,
对于类类型
可以使用操作符来生成LValk、XValuy或PROVE来重载任何操作符。然而,让重载运算符具有与内置运算符相似的语义被认为是一种好的方式,这就是为什么人们重载是正常的
|
![]() |
6
9
首先,“左值”是指在赋值的左侧(左值中的“L”)是合法的表达式。这意味着它代表一个地址,该地址的内容可以通过赋值来改变。(C标准将这样的东西称为“对象”。)这就是为什么,例如,中缀运算符表达式和函数调用不是左值。 “rvalue”是一个愚蠢的术语;任何格式良好的表达式在赋值的右侧都是合法的(不考虑类型转换问题)。 标准规定,例如:
…都是“未定义的语句表达式”,这意味着它们的实现(因此行为)不标准。 “++i”的一般意义是“增加对象i的值,并对结果求值”。类似地,“i++”表示“对对象i的当前值求值,然后增加对象的值”。也没有说明当“++i”或“i++”用作左值时会发生什么。 标准的about表达式是这样说的:“运算符的操作数的值计算在运算符结果的值计算之前进行排序。”因为操作数的值计算受运算符的值计算的影响。 对我来说最有意义的是:
我的建议是——不要用那么难理解的表达方式! |
![]() |
apetrai · 我应该如何假设算法使用哪种迭代器类别? 2 年前 |
![]() |
ridiculous_fish · std::是否保证短路? 3 年前 |
![]() |
Fabio · 在c中将指针赋给常数指针++ 3 年前 |
![]() |
johnco3 · 初始化固定C数组成员结构 7 年前 |
![]() |
mans · 为什么出现此错误:constexpr在此处无效 7 年前 |
![]() |
juztcode · 在C++中尝试捕获-创建了多少个对象 7 年前 |
![]() |
Steven Scott · 忽略元素的基于范围的for循环 7 年前 |