我可以分配成员访问操作员的返回值吗?



我已经读到成员访问操作员点运算符.和箭头操作员->返回值:

箭头操作员需要一个指针操作数并产生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,也是不明式的。

最新更新