[英]what's difference between const auto and const type*
为什么会发生错误,我认为 const auto data_0 应该与 const Data* data_1 相同,那么 data_0 和 data_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
对象的常量指针。 SetVal()
是一个非常量方法,因此可以在对象上调用它。
在const Data* data_1 = GetData(0);
, const
适用于Data
。 所以,最终的声明是:
Data const * data_1 = GetData(0);
const
适用于所指向的事物,而不适用于指针本身。 因此, data_1
是一个指向 const Data
对象的非常量指针。 SetVal()
不是 const 方法,因此不能在对象上调用它。
const auto 和 const type 之间有什么区别*
const auto
将从初始化器中推导出来,并且是一个 const 限定类型。 在data_0
情况下,初始化器的类型是指向非常量Data
的指针,因此推导出的类型成为指向非常量Data
的常量限定指针,即Data* const
。
const type*
是指向 type type
的 const 限定对象的非常量限定指针。 区别在于一个是指向const的非常量指针,另一个是指向非常量的const指针。
为什么会发生错误
因为你通过一个指向 const 的指针调用了一个非常量限定的成员函数。
我认为 const auto data_0 应该与 const Data* data_1 相同
不是,也不应该是。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.