问题描述
为什么会发生错误,我认为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相同
不是,也不应该。