采用左值操作数的运算符的结果是表示该左值操作数的左值?

The result of an operator that takes an lvalue operand is an lvalue denoting that lvalue operand?

通读 Bjarne 的 CPP 书,我遇到了这样的说法:“在逻辑上可行的情况下,采用左值操作数的运算符的结果是表示该左值操作数的左值”,我真的无法换行我的头围绕着它。这些是此声明中包含的示例:

void f(int x, int y)
{
    int j = x = y; // the value of x=y is the value of x after the assignment
    int∗ p = &++x; // p points to x
    int∗ q = &(x++); // error : x++ is not an lvalue (it is not the value stored in x)
    int∗ p2 = &(x>y?x:y); // address of the int with the larger value
    int& r = (x<y)?x:1; // error : 1 is not an lvalue
}

代码本身对我来说是有意义的,但从我个人对这些运算符如何工作的理解来看是有意义的。但我不能真正在这里应用该语句,例如第一行。好的,= 是一个可以接受左值和右值操作数的运算符(根据我的理解,在这种情况下,左值被隐式转换为右值),那么 x = y 的结果是表示 [=13 的左值=]?如果我正确地遵循这个,那么我可以写 int* j = x = y,但这将是一个编译时错误,因为 x = y 的结果显然是一个右值。所以我在这里真的很困惑。

任何人都可以阐明此语句在语义上的含义以及它与给定示例的关系吗?

  • x = y returns 左值指的是左操作数。
  • int* j = x = y,这是错误的,因为操作数的类型无效。

但是,

  • int* j = &(x = y) :

    有效,因为 x = y returns 左值所以这归结为 int *j = &x(x 的值为 y)

    同样,这个int& j = x = y也有效

附加链接:

对于条件表达式:Return type of '?:' (ternary conditional operator)