我已经阅读到成员访问运算符点运算符.
和箭头运算符->
返回值:
箭头运算符需要一个指针操作数并产生一个左值。如果从中获取成员的对象是一个左值,则点运算符将产生一个左值;否则结果是右值。
这是来自C ++ Primer 5版本。
所以我想我可以在每当非常量左值返回表达式时分配一个值,例如:
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
我对分配给arrow运算符的返回值感到困惑。上面说->
总是返回一个左值,但是如果我尝试分配给该值,它将失败。
答案 0 :(得分:4)
上面说->总是返回一个左值,但是如果我尝试分配给该值,它将失败。
这是关于成员变量,而不是函数。 bar
返回void
,因此您永远都无法为其分配。 x_
之所以有效,是因为它为您提供了一个整数左值表达式。 y_
失败,因为它是const
,并且您无法分配给const
变量。
所以,在
foo bar;
foo* f = &bar;
f->x_;
f->y_;
两个成员访问都产生一个左值表达式。在
foo f;
f.x_;
f.y_;
您又有了左值,因为f
是左值。但是,在
foo{}.x_;
foo{}.y_;
两个成员访问都是右值,因为foo{}
是右值。
答案 1 :(得分:2)
我可以分配给成员访问运算符的返回值吗?
如果运算符的左手操作数是一个左值,并且该成员是可分配的且非常量,则为是。在其他情况下,不会。
(pf->bar()) = 75; // error
您没有分配给成员访问运算符的结果。您正在调用成员函数。结果是函数返回的结果。该函数返回void
,该值不可分配。
(pf->y_) = 34;// error
您正在尝试分配const对象。即使表达式是左值,它也是不正确的。