我可以分配给成员访问运算符的 return 值吗?
Can I assign to the return value of member access operator?
我读到成员访问运算符点运算符 .
和箭头运算符 ->
return 值:
The arrow operator requires a pointer operand and yields an lvalue. The dot operator yields an lvalue if the object from which the member is fetched is an lvalue; otherwise the result is an rvalue.
这是来自 C++ Primer 5 版。
所以我想我可以在非常量左值是它们表达式的 return 时分配一个值,例如:
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
我对分配给箭头运算符的 return 值感到困惑。上面说 ->
总是 returns 一个左值但是如果我尝试分配给那个值它会失败。
- 任何人都可以向我解释一下 C++ 书中的上述段落。谢谢。
Above it is said that -> always returns an lvalue but it fails if I try to assign to that value.
这是关于成员变量,而不是函数。 bar
returns 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{}
是右值。
Can I assign to the return value of member access operator?
如果运算符的左手操作数是左值,并且如果成员是可赋值的和非常量的,那么是。在其他情况下,没有。
(pf->bar()) = 75; // error
您没有为成员访问运算符的结果赋值。您正在调用成员函数。结果是任何函数 returns。函数 returns void
,不可赋值。
(pf->y_) = 34;// error
您正试图分配一个 const 对象。即使表达式是左值,这也是不正确的。
我读到成员访问运算符点运算符 .
和箭头运算符 ->
return 值:
The arrow operator requires a pointer operand and yields an lvalue. The dot operator yields an lvalue if the object from which the member is fetched is an lvalue; otherwise the result is an rvalue.
这是来自 C++ Primer 5 版。
所以我想我可以在非常量左值是它们表达式的 return 时分配一个值,例如:
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
我对分配给箭头运算符的 return 值感到困惑。上面说 ->
总是 returns 一个左值但是如果我尝试分配给那个值它会失败。
- 任何人都可以向我解释一下 C++ 书中的上述段落。谢谢。
Above it is said that -> always returns an lvalue but it fails if I try to assign to that value.
这是关于成员变量,而不是函数。 bar
returns 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{}
是右值。
Can I assign to the return value of member access operator?
如果运算符的左手操作数是左值,并且如果成员是可赋值的和非常量的,那么是。在其他情况下,没有。
(pf->bar()) = 75; // error
您没有为成员访问运算符的结果赋值。您正在调用成员函数。结果是任何函数 returns。函数 returns void
,不可赋值。
(pf->y_) = 34;// error
您正试图分配一个 const 对象。即使表达式是左值,这也是不正确的。