Получение ошибки: невозможно получить адрес значения 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, невозможно.

Другие вопросы по тегам