为什么[expr.ref] / 2下面的prvalue?

时间:2017-03-24 19:13:53

标签: c++ language-lawyer c++17

[expr.ref]/2

  

对于第一个选项(点),第一个表达式应为glvalue   拥有完整的班级类型。对于第二个选项(箭头)第一个   expression应该是一个 prvalue ,它具有指向完整类类型的指针。   表达式E1-> E2被转换为等价形式(*(E1))。E2;   [expr.ref]的其余部分仅解决第一个选项   (点).68在任何一种情况下,id-expression都应该命名一个成员   类或其基类之一。 [注意:因为一个名字   class被插入其类范围(Clause [class]),一个名称   class也被认为是该类的嵌套成员。 - 结束说明]   [注意:[basic.lookup.classref]描述了如何查找名称   之后 。和 - >运营商。 - 结束说明]

在下面的代码段中,p->f()后缀表达式p是左值。

struct A{ void f(){} };
A *p = new A;
int main(){
    p->f();
}

1 个答案:

答案 0 :(得分:3)

每当需要prvalue但给出glvalue时,glvalue可以通过左值到右值转换 [conv.lval]转换为prvalue。因此,prvalues相当普遍且容易获得。