[英]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.