C++ 接受左值操作数的运算符的结果是表示该左值操作数的左值?

C++ 接受左值操作数的运算符的结果是表示该左值操作数的左值?,c++,rvalue,lvalue,C++,Rvalue,Lvalue,在阅读比亚恩的CPP书时,我遇到了这样一种说法:“在逻辑上可行的情况下,接受左值操作数的运算符的结果是表示该左值操作数的左值”,我真的无法理解它。以下是本声明中包含的示例: void f(整数x,整数y) { int j=x=y;//x=y的值是赋值后x的值 int∗ p=&++x;//p指向x int∗ q=&(x++);//错误:x++不是左值(它不是存储在x中的值) int∗ p2=&(x>y?x:y);//值较大的int的地址 int&r=(x x=y返回引用左侧操作数的左值 int*j

在阅读比亚恩的CPP书时,我遇到了这样一种说法:“在逻辑上可行的情况下,接受左值操作数的运算符的结果是表示该左值操作数的左值”,我真的无法理解它。以下是本声明中包含的示例:

void f(整数x,整数y)
{
int j=x=y;//x=y的值是赋值后x的值
int∗ p=&++x;//p指向x
int∗ q=&(x++);//错误:x++不是左值(它不是存储在x中的值)
int∗ p2=&(x>y?x:y);//值较大的int的地址
int&r=(x
  • x=y
    返回引用左侧操作数的左值
  • int*j=x=y
    ,这是错误的,因为操作数类型无效
但是,

  • int*j=&(x=y)

    工作,因为
    x=y
    返回l值,所以这归结为
    int*j=&x
    (x的值是y)

    同样,这个
    int&j=x=y
    也可以工作

其他链接:

对于条件表达式:

  • x=y
    返回引用左侧操作数的左值
  • int*j=x=y
    ,这是错误的,因为操作数类型无效
但是,

  • int*j=&(x=y)

    工作,因为
    x=y
    返回l值,所以这归结为
    int*j=&x
    (x的值是y)

    同样,这个
    int&j=x=y
    也可以工作

其他链接:


对于条件表达式:

x=y
的结果是一个lvaule,表示
x
(其中包含
y
中的值)
x=y
是一个整数值,不能将其分配给指针,但
int*i=&(x=y)
works@AlexLarionov如果赋值的结果是一个整数,那么指针赋值将不起作用,因为这需要一个lvaule。@RichardCriten我现在明白了我在措辞上的错误,thanksWell,结果是可以写
int&j=x=y;
,所以看起来是的,
=
操作符确实返回了一个lv赋值后表示
x
的值!这样,语句本身就开始有意义了。是否有人想在此处发布答案,以便我将其作为正确答案?
x=y
的结果是表示
x
的lvaule(其中包含
y
中的值)
x=y
是一个整数值,不能将其分配给指针,但
int*i=&(x=y)
works@AlexLarionov如果赋值的结果是一个整数,那么指针赋值将不起作用,因为这需要一个lvaule。@RichardCriten我现在明白了我在措辞上的错误,thanksWell,结果是可以写
int&j=x=y;
,所以看起来是的,
=
操作符确实返回了一个lv赋值后表示
x
的值!有了这个值,语句本身就开始有意义了。是否有人想在这里发布一个答案,以便我将其作为正确答案?