Почему указатель неявно преобразуется в <type>const * const - PullRequest
1 голос
/ 01 октября 2019

AT45Status - это структура с несколькими членами, и у меня есть следующая функция:

/**
 * @brief read the chip status from the flash chip
 * @retval a pointer to the current status of the chip
 */
AT45Status const * const ReadChipStatus(void) {
  uint8_t commands[1] = {STATUS_READ};
  static AT45Status status;

  //// … details, but the result is updated values inside status

  return &status;
}

Я получаю следующее предупреждение, если скомпилирую это с использованием C ++:

…(16): предупреждение: # 815-D: спецификатор типа для возвращаемого типа не имеет смысла

Я, конечно, посмотрел точное объяснение , и это важное предупреждение для тривиальноготип, который является семантически переданным значением. Но я возвращаю указатель на объект, который я не хочу менять. (указатель или данные, на которые указывает). Таким образом, спецификатор типа имеет смысл.

Предупреждения исчезают, когда я изменяю инструкцию return на:

return (AT45Status const * const)&status;

Почему компилятор не может / неявно не привести AT45Status*в AT45Status const * const? Чего мне не хватает в этом взаимодействии?

Ответы [ 2 ]

4 голосов
/ 01 октября 2019

Предупреждение пытается сообщить вам, что вы пытаетесь вернуть указатель const, который не имеет смысла, поскольку сам возвращаемый указатель не может быть изменен.

С другой стороны, уточняйтеобъект, указываемый как const, имеет смысл (чтобы объект указывал на неизменяемый), то есть возвращает указатель на const. например,

AT45Status const * ReadChipStatus(void)
1 голос
/ 01 октября 2019

Например, такое объявление, как

const int f();

, не имеет смысла для фундаментальных типов. Возвращаемое значение является временным объектом и не может быть изменено, даже если вы удалите квалификатор const.

int f();

Например, вы не можете писать

++f();

Компилятор выдаст ошибку.

Та же самая ситуация имеет место с указателем.

...