簡體   English   中英

Auto和Void之間的區別?

[英]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不同,編譯器無法警告不正確的使用。

從編譯器的角度來看

  • 在C ++ 11中, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM