StoryTeller уже объяснил, где в стандарте почему для вашего примера выражение (i)
по-прежнему является lvalue, но я полагаю, что вы зациклены на спецификации без причины, поэтому позвольте мне попытаться решить ваши проблемы.
Я проверил код и правила и обнаружил следующее: в семантике выражения присваивания:
Оператор присваивания должен иметь изменяемое значение lvalue в качестве своего левого операнда.
Выражение присваивания имеет значение левого операнда после присваивания, но не является lvalue.
Вся кавычка относится к выражению присваивания в целом, а не кlhs или rhs.
«Оператор присваивания должен иметь изменяемое lvalue в качестве своего левого операнда». утверждает, что lhs должен быть изменяемым lvalue.
«Выражение присваивания имеет значение левого операнда после присваивания, но не является lvalue». заявляет, что само выражение присваивания в результате имеет значение lhs и само является rvalue.
Итак, все верно следующее:
int i;
i <- modifiable lvalue
(i) = 1;
(i) <- modifiable lvalue (per StoryTeller's answer)
1 <- rvalue
((i) = 1) <- rvalue
Почему это важно? Рассмотрим следующее:
int i = 0, j = 0, k = 0;
i = j = k = 1;
// parsed as `i = (j = (k = 1))`
// the expression `k = 1` has the value `1` and is an rvalue
// the expression `j = (k = 1)` has the value `1` and is an rvalue
(i = 2) = 3;
// is invalid, the expression `i = 2` is an rvalue, but it may not be the lhs of the assignment
В моем случае существует два выражения присваивания: (i) = 1
и i
в скобках. Таким образом, (i)
должно быть значением.
Нет, это неверно. (i) = 1
является единственным выражением присваивания. Существует два подвыражения (один заключенный в скобки идентификатор (i)
и числовая константа 1
).