我已经读到成员访问操作员点运算符.
和箭头操作员->
返回值:
箭头操作员需要一个指针操作数并产生lvalue。如果获取成员的对象是lvalue,则点运算符会产生lvalue;否则结果是rvalue。
这是来自C 引物5版。
所以我想我可以分配一个值,每当非const lvalue是其表达式的返回,例如:
struct foo {
int x_;
const int y_ = 17; ;
void bar() { cout << "bar()" << endl;}
}f, *pf;
pf = &f;
(pf->bar()) = 75; // error
cout << f.x_ << endl;
(f.bar()) = 12;// error
(f.x_) = 23;
cout << "f_x: " << f.x_ << endl;
(pf->y_) = 34;// error
我对分配给箭头运算符的返回值感到困惑。上面据说->
总是返回lvalue,但是如果我尝试分配该值,则会失败。
- 任何人都可以向我解释C 书上面的段落。谢谢。
上面有人说 ->总是返回一个lvalue,但是如果我尝试分配该值,它会失败。
这是关于成员变量的,而不是函数。bar
返回void
,因此您永远无法分配。x_
起作用,因为它为您提供了整数LVALUE表达式。y_
失败,因为它是const
,并且您无法分配给const
变量。
所以,在
中foo bar;
foo* f = &bar;
f->x_;
f->y_;
两个成员访问产生的表达式。在
中foo f;
f.x_;
f.y_;
您再次拥有LVALUE,因为f
是一个LVALUE。但是,在
foo{}.x_;
foo{}.y_;
两个成员访问都是RVALUE,因为foo{}
是RVALUE。
我可以分配给成员访问操作员的返回值吗?
如果操作员的左手操作数是LVALUE,并且如果成员是可分配的,并且是非const,则是的。在其他情况下,第
(pf->bar()) = 75; // error
您未分配成员访问操作员的结果。您正在调用成员功能。结果是函数返回的内容。该函数返回void
,该函数无法分配。
(pf->y_) = 34;// error
您正在尝试分配const对象。即使表达式为lvalue,也是不明式的。