const auto和const type *有什么区别*

问题描述

为什么会发生错误,我认为const auto data_0应该与const Data * data_1相同, 数据_0和数据_1之间有什么区别?

class Data {
public:
  Data(int val_) : val(val_) {
  }
  ~Data() {
  }
  void SetVal(int val_) {
    val = val_;
  }
private:
  int val;
};

Data* GetData(int val) {
  return new Data(val);
}

int main () {
  const auto data_0 = GetData(0);
  const Data* data_1 = GetData(0);
  data_0->SetVal(1);  // OK 
  data_1->SetVal(1);  // error: passing ‘const Data’ as ‘this’ argument discards qualifiers
  return 0;
}

解决方法

const适用于它左边的东西,除非没有什么适用于它右边的东西。

const auto data_0 = GetData(0);中,const适用于auto推断出的任何类型,在这种情况下为Data*。因此,最后的声明是:

Data * const data_0 = GetData(0);

const适用于指针本身,而不是指针所指向的对象。因此,data_0是指向非常量Data对象的const指针。 SetVal()是非常量方法,因此可以在对象上调用。

const Data* data_1 = GetData(0);中,const适用于Data。因此,最后的声明是:

Data const * data_1 = GetData(0);

const适用于所指向的对象,而不适用于指针本身。因此,data_1是指向const Data对象的非const指针。 SetVal()不是const方法,因此无法在对象上调用。

,

const auto和const type *有什么区别>

const auto将从初始化程序推导出,并且将是const限定类型。在data_0的情况下,初始化程序的类型是指向非常量Data的指针,因此推论的类型成为指向非常量Data的const限定指针,即{{1} }。

Data* const是指向类型const type*的const限定对象的非const限定指针。区别在于,一个是指向const的非常量指针,另一个是指向非const的const指针。

为什么会发生错误

因为您通过指向const的指针来调用非const限定成员函数。

我认为const auto data_0应该与const Data * data_1相同

不是,也不应该。