根据@Potatoswatter 的建议,我创建了一个新的讨论。
参考是这个回应 https://stackoverflow.com/questions/3852768/unsequenced-value-computations-a-k-a-sequence-points/3852774#3852774来自@Potatoswatter
给出代码片段,
int i = 3, &j = i;
j = ++ i;
我寻求澄清的评论是这样的。 (这似乎是我对无序评估(又称序列点)的理解中一个重要的缺失部分):
@Chubsdad:尽管它是一个别名,
它的左值评估不
需要对 i 进行左值评估。一般来说,评价一个
参考文献不需要
手头上的原始对象。有
没有理由它应该是 UB,所以它使得
感觉应该有一个容易的漏洞
或转换为不是的代码
UB。
and
参考文献没有告诉
编译器去看看引用的
变量并获取其左值,因为
它可能不知道变量是什么
参考。编译器计算出
参考的左值和
左值标识一个对象。如果你
想进一步辩论这个问题,请
提出一个新问题。
问题中任何可能的不明确都是“未定义行为”的一部分,我正在尝试理解 C++0x 中的“无序求值”、“序列点”等。
想象一下下面的情况
int &i = *new int;
如果你这么说的话i
是另一个名字的别名 - 什么名字?引用可以引用对象或函数。当您说“glvalue”时,您指的是特定表达式的属性,而不是对象的属性。
int i = 0;
int &ri = i;
Now, i
是一个左值表达式并且ri
也是一个左值表达式(语法类别id-expression
). They name(通过名称查找找到)参考和int
多变的。
如果您现在确定ri
在这种情况下,您需要获取引用并使表达式引用它初始化的对象。这称为左值评估,因为您确定左值(即所指对象)的属性。
您需要对i
案件。即你弄清楚左值表达式针对什么对象i
指。左值评估ri
因此与左值评估不同i
,尽管它们都产生相同的结果。
右值求值意味着获取左值并将左值应用到右值转换。换句话说,读取一个值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)