-2

我读过成员访问运算符点运算符.和箭头运算符->返回值:

箭头运算符需要一个指针操作数并产生一个左值。如果从中获取成员的对象是左值,则点运算符产生左值;否则结果是一个右值。

这是来自 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

我对分配给箭头运算符的返回值感到困惑。上面据说->总是返回一个左值,但如果我尝试分配给该值,它会失败。

  • 任何人都可以向我解释 C++ 书中的上述段落。谢谢你。
4

2 回答 2

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{}是右值。

于 2019-03-06T20:13:11.483 回答
2

我可以分配给成员访问运算符的返回值吗?

如果运算符的左侧操作数是左值,并且该成员是可赋值且非常量的,则可以。在其他情况下,没有。

(pf->bar()) = 75; // error

您没有分配给成员访问运算符的结果。您正在调用成员函数。结果是函数返回的任何内容。函数返回void,它是不可赋值的。

 (pf->y_) = 34;// error

您正在尝试分配一个 const 对象。即使表达式是左值,那也是格式错误的。

于 2019-03-06T20:13:13.940 回答