评估参考表达

时间:2010-10-06 07:10:22

标签: c++ reference expression evaluation

根据@ Potatoswatter的建议,我创建了一个新讨论。

来自@Potatoswatter的参考号为this response

给出代码片段,

int i = 3, &j = i; 
j = ++ i;

我寻求澄清的评论是这样的。 (这似乎是我对无序评估a.k.a序列点的理解中一个重要的缺失部分):

  

@Chubsdad:即使它是别名,   它的glvalue评估没有   需要对我进行glvalue评估。   一般来说,评估一个   参考不需要   原始物体就在眼前。有   没有理由它应该是UB,所以它会   感觉应该有一个容易的漏洞   或转换为非代码   UB。

  

参考文献没有说明   编译器去看看引用   变量并得到它的左值,因为   它可能不知道变量是什么   引用。编译器计算   左右参考和那个   左值标识一个对象。如果你   我想进一步辩论   打开一个新问题。

问题中任何可能缺乏明确性的都是'未定义行为'的一部分我试图理解C ++ 0x中的“无序评估”,“序列点”等。 < / p>

2 个答案:

答案 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 ++引用的方法:

  1. 作为编译器符号表中的注释。仅当引用仅绑定到一个对象时才可以执行此操作,但它也最接近引用的概念。 IMO,大多数编译器在可能的情况下使用此技术,例如此处提供的示例。
  2. 作为在每次操作时自动解除引用的指针。这是后备解决方案,因为它与参考概念不匹配,但它确实更容易实现引用类型的函数参数,而不必严重更改ABI。
  3. 在所提供的示例中,从来没有一种方法可以存在未绑定到对象j的引用i,因此编译器很可能使用符号表注释方法实施参考。这意味着,在声明ij之后,它们可以在代码中互换使用,而不会对生成的代码或行为定义的问题产生任何影响。