[英]Difference between Auto and Void?
我正在閱讀C ++ Primer Book(第五版),我對正在閱讀的書有疑問。 它說:
void*
類型是一種特殊的指針類型,可以保存任何對象的地址。 與任何其他指針一樣,void*
指針保存一個地址,但該地址處對象的類型未知。
好的,所以我理解但是...我對這個陳述有很多矛盾。 首先,你能用auto
嗎? 它不是和void
嗎? 意思不是
void *somePtr;
和
auto *somePtr;
相同?
其次,它說附加地址的類型是未知的。 你不能使用typeid
獲取類型嗎? 像這樣:
int a = 5;
auto *somePtr = 5;
std::cout << typeid(*somePtr).name() << std::endl;
您是否嘗試通過編譯器運行示例? 碰巧,兩者都沒有
auto * p; // error
也不
int a = 0;
void * p = &a;
std::cout << typeid(*p) << '\n'; // error
將兩者都編譯
void * p;
和
int a = 0;
auto * p = &a;
std::cout << typeid(*p) << '\n';
沒事。
為了給void *
和auto *
提供一個非正式且易於記憶的類比,請將void * p
視為告訴編譯器
不關心
p
指針指向的是什么,我將自己處理它(在運行時)。
而auto * p = (expression)
告訴編譯器
請為我(在編譯時)計算出什么(指針)類型
(expression)
計算結果並使p
的類型相應。
事實上, auto *
很少有用。 您可以簡單地編寫auto
,如果初始化表達式是指針類型,則auto
也將被推斷為指針。
auto
使用編譯時類型推斷 :變量具有明確的類型,它是正確的類型,但是類型是從其值推斷出來的。 在auto
變量的整個生命周期中,編譯器將確保根據其實際推斷類型使用它
void*
確實可以保存任何對象的地址,但與auto
相反,您必須在使用之前將void*
指針顯式轉換為其他類型。 與auto
不同,轉換是顯式的,與auto
不同,編譯器無法警告不正確的使用。
從編譯器的角度來看 :
auto
使用與模板參數推導相同的推理規則。 它基本上告訴編譯器: “從初始化器中推斷出類型。” void *
告訴編譯器: “這是一個指向一個對象的指針,該對象的類型在編譯時是不可能知道的。” 對於auto
,實際類型是在編譯時推斷出來的 ,因此編譯器可以警告可能的誤用。
對於void *
, 程序員使用reinterpret_cast
在代碼中推導出實際類型,以強制轉換為已知的指針類型,通常是在執行該段代碼時。
從程序員的角度來看 :
auto
它,讓你弄明白其余的。 (它看起來比我要編寫的類型小。除了 int
。) void *
。 當我需要它時,我會在運行時自己找出類型(在代碼中...)。
所以NO auto
不等於void
。 void
意義 。 實際上你甚至不能聲明一個void
類型的變量。 void *
然而,它是一種特殊類型的指針 ,可以指向任何東西! 而auto *
是多余的,只需使用普通的舊auto
。
在你的例子中,
int a = 5; auto *somePtr = 5; std::cout << typeid(*somePtr).name(); << std::endl;
您為somePtr
分配了一個非法的地址5
。 毫無疑問地說, *somePtr
在這種情況下也是非法的。 雖然auto
可能推斷為int
,這是你想要打印的。
使用現代C ++技術,除了深入任何庫實現內部之外,您很少看到void *
s和reinterpret_cast
或任何原始指針。
要回答你的第一個問題,
void和auto不一樣。 When you declare a variable of auto, it means it takes the data types of the value assigned
。
對於前:
auto a = 5 //'a'的類型為整數
auto a = 5.0 //'a'的類型為float等,
解除引用時可以觀察到實際差異。
上面的陳述“解除引用時可以觀察到實際差異”回答了你的第二個問題。
void *不能被引用,而auto *可以被引用
如果是自動變量,它將采用變量的數據類型。 例如,Auto obj = class_obj。 這里class_obj的數據類型變為obj的數據類型。 你不需要明確記住並輸入強制轉換。 如果是void *,您需要知道數據類型並進行explicetly類型轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.