根据@ Potatoswatter的建议,我创建了一个新讨论。
来自@Potatoswatter的参考号为this response
给出代码片段,
int i = 3, &j = i;
j = ++ i;
我寻求澄清的评论是这样的。 (这似乎是我对无序评估a.k.a序列点的理解中一个重要的缺失部分):
@Chubsdad:即使它是别名, 它的glvalue评估没有 需要对我进行glvalue评估。 一般来说,评估一个 参考不需要 原始物体就在眼前。有 没有理由它应该是UB,所以它会 感觉应该有一个容易的漏洞 或转换为非代码 UB。
和
参考文献没有说明 编译器去看看引用 变量并得到它的左值,因为 它可能不知道变量是什么 引用。编译器计算 左右参考和那个 左值标识一个对象。如果你 我想进一步辩论 打开一个新问题。
问题中任何可能缺乏明确性的都是'未定义行为'的一部分我试图理解C ++ 0x中的“无序评估”,“序列点”等。 < / p>
答案 0 :(得分:2)
想象一下以下
int &i = *new int;
如果你说i
是另一个名字的别名 - 什么名字?引用引用对象或函数。当您说“glvalue”时,您引用特定表达式的属性,而不是对象的属性。
int i = 0;
int &ri = i;
现在,i
是一个左值表达式,ri
也是一个左值表达式(两个句法类别id-expression
)。他们名称(通过名称查找找到)一个引用和一个int
变量。
如果您现在确定ri
案例的对象标识,则需要获取引用并使表达式引用它初始化的对象。这称为左值评估,因为您确定左值的属性(即指示对象)。
您需要对i
案例执行相同的操作。即你想出了左值表达式i
所指的对象。因此,ri
的glvalue评估与i
的glvalue评估不同,尽管它们都产生相同的结果。
Rvalue评估意味着获取左值并将左值应用于右值转换。换句话说,要读取一个值。
答案 1 :(得分:1)
从概念上讲,C ++中的引用是某个对象的别名或替代名称。正是这个概念引导您在涉及参考时解释语言规则。
实际上有两种实现C ++引用的方法:
在所提供的示例中,从来没有一种方法可以存在未绑定到对象j
的引用i
,因此编译器很可能使用符号表注释方法实施参考。这意味着,在声明i
和j
之后,它们可以在代码中互换使用,而不会对生成的代码或行为定义的问题产生任何影响。