C++ 为什么指针没有隐式转换为const*const

C++ 为什么指针没有隐式转换为const*const,c++,pointers,constants,keil,C++,Pointers,Constants,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 AT45Stat

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 int f();
对于基本类型没有意义。返回的值是一个临时对象,即使删除常量限定符,也无法更改

int f();
例如,你可能不会写

++f();
编译器将发出一个错误


指针也会出现同样的情况。

例如这样的声明

const int f();
对于基本类型没有意义。返回的值是一个临时对象,即使删除常量限定符,也无法更改

int f();
例如,你可能不会写

++f();
编译器将发出一个错误


指针也会出现同样的情况。

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

另一方面,将指向的对象限定为常量对于使指向的对象不可修改(即返回指向常量的指针)是有意义的。e、 g


警告试图告诉您您试图返回一个常量指针,这是没有意义的,因为返回的指针本身无法修改

另一方面,将指向的对象限定为常量对于使指向的对象不可修改(即返回指向常量的指针)是有意义的。e、 g


所有指针都是普通类型。即使没有常量限定符,也无法更改它们。ReadChipStatus=nullptr;无效。所有指针都是普通类型。即使没有常量限定符,也无法更改它们。ReadChipStatus=nullptr;这是无效的。