为什么指针没有隐式转换为<type> const * const

时间:2019-10-01 10:16:10

标签: c++ pointers const keil

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:返回类型上的类型限定符没有意义

我当然查找了an exact explanation,这对于从语义上传递值的琐碎类型是一个相关的警告。但是我正在返回一个指向我不想更改的对象的指针。 (指针或指向的数据)。因此,类型限定符是有意义的。

将return语句更改为以下内容时,警告消失:

return (AT45Status const * const)&status;

为什么编译器不能/不可以将AT45Status*隐式转换为AT45Status const * const?在这次互动中我缺少什么?

2 个答案:

答案 0 :(得分:4)

警告试图告诉您您正在尝试返回const指针,这是没有意义的,因为返回的指针本身无法修改。

另一方面,将指向的对象限定为const是有意义的(以使指向的对象不可修改),即返回指向const的指针。例如

AT45Status const * ReadChipStatus(void)

答案 1 :(得分:1)

例如这样的声明

const int f();

对于基本类型没有意义。返回的值是一个临时对象,即使您将删除const限定符,也无法更改。

int f();

例如,您可能不会写

++f();

编译器将发出错误。

指针也会发生同样的情况。