Результатом оператора, который принимает операнд lvalue, является lvalue, обозначающий этот операнд lvalue? - PullRequest
1 голос
/ 02 августа 2020

Читая книгу Бьярна 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-значением. Так что я действительно запутался здесь.

Может ли кто-нибудь уточнить, что это за утверждение семантически и как оно соотносится с приведенными примерами шаг за шагом?

1 Ответ

0 голосов
/ 02 августа 2020
  • x = y возвращает lvalue, относящееся к левому операнду.
  • int* j = x = y, это ошибочно из-за недопустимых типов операндов.

Но,

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

    работает, поскольку x = y возвращает l-значение, поэтому это сводится к int *j = &x (значение x равно y)

    и аналогично, этот int& j = x = y также работает

Дополнительные ссылки:

Для условных выражений: Тип возврата ' ?: '(тернарный условный оператор)

...