Я тоже наткнулся на некоторую странность, связанную с этим тоже.Кажется, что результат троичного условия может быть обработан как lvalue в gcc 3.3.2, но не в gcc 4.6 (у меня нет больше готовых версий для его дальнейшего сужения).На самом деле невозможно скомпилировать gcc 3.3.2 с использованием gcc 4.6 именно потому, что gcc 4.6 гораздо требовательнее относится к тому, что составляет lvalue.
Другой пример из источника gcc 3.3.2, который не компилируется с gcc 4.6:
char *x = ...;
*((void**)x)++ = ...;
gcc 4.6 может обрабатывать результат приведения как lvalue и увеличивать его, но gcc 4.6 не будет.
У меня также нет соответствующих стандартов для передачивыясните, что это что-то, что изменилось в официальном стандарте, или что-то, что gcc разрешило на каком-то этапе.
Обратите также внимание, что C ++ позволяет троичному оператору возвращать lvalue, хотя вы все еще не можете увеличить 0.Так что это действительный C ++, но не действительный C:
int c = 0, d = 0;
(c?c:d)++;