Читая книгу Бьярна CPP, я столкнулся с таким утверждением: «Там, где это логически возможно, результатом оператора, который принимает операнд lvalue, является lvalue, обозначающее этот операнд lvalue», и я действительно не могу обернуть моя голова вокруг него. Вот примеры, включенные в этот оператор:
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
}
Код сам по себе имеет смысл для меня, но он имеет смысл из моего личного понимания того, как работают эти операторы. Но я не могу применить здесь утверждение, например, для первой строки. Хорошо, =
- это оператор, который может принимать как операнды lvalue, так и rvalue (и, насколько я понимаю, lvalue неявно преобразуется в rvalue в этом случае), тогда результатом x = y
будет lvalue, обозначающее y
? Если я буду следовать этому правилу правильно, то могу написать int* j = x = y
, но это будет ошибка времени компиляции, поскольку результат x = y
явно является r-значением. Так что я действительно запутался здесь.
Может ли кто-нибудь уточнить, что это за утверждение семантически и как оно соотносится с приведенными примерами шаг за шагом?