Получение ошибки: невозможно получить адрес значения r типа int
Я попытался скомпилировать старый код с новым компилятором и получил следующую ошибку:
error: cannot take the address of an rvalue of type 'int'
Вот пример с двумя строками: одна компилируется, а другая выдает ошибку
struct mstct {
int myfield;
int myfield2[5];
int myfield3[5];
};
typedef struct mstct db_data_px;
int foo(int a, int b, int c){
//the next code compiles successfully.
unsigned val1 = ((18 == c) ? ((unsigned) & (((db_data_px *) 0)->myfield)) : ((unsigned) & (((db_data_px *) 0)->myfield3[b]))); //successes
//the next code is failing
unsigned val2 = (unsigned) & ((18 == c) ? (((db_data_px *) 0)->myfield) : (((db_data_px *) 0)->myfield3[b]));
return 0; // failing
}
Почему первая строка компилируется, а вторая терпит неудачу? Почему мне нужно привести (без знака) & в обоих выражениях выбора, и этого недостаточно для преобразования только после того, как выражение выбора оценено?
1 ответ
В вашем коде
((18 == c) ? (((db_data_px *) 0)->myfield) : (((db_data_px *) 0)->myfield3[b]))
является условным выражением, которое не производит lvalue.
Вышеупомянутое выражение дает вам значение (не-lvaue), и вы не можете использовать &
оператор на этом.
Разрабатывать, цитируя C11
стандарт, глава §6.5.3.2, Операторы адреса и косвенности
Операнд одинарного
&
оператор должен быть либо указателем функции, результатом[]
или одинарный*
оператор или lvalue, который обозначает объект, который не является битовым полем и не объявлен сregister
спецификатор класса хранения.
OTOH, для типа результата условного оператора, глава §6.5.15, сноска
Условное выражение не дает lvalue.
Представь, &5
, невозможно.