簡體   English   中英

`auto` 和 `std::any` 有什么區別?

[英]What is the difference between `auto` and `std::any`?

我最近遇到了基於boost::any在 C++17 中引入的std::any class 。 這個 class 可以“持有任何類型的實例”並auto推斷變量的數據類型。

那么主要區別是什么? 優缺點都有什么?

std::anyauto是完全不同的結構。


std::any是一種容器類型,可以容納任何類型的對象:

std::any a = 42;        // a holds an int, but type is std::any
a = std::string{"hi"};  // ok, a holds a string now

std::any持有的對象的類型可以在程序執行期間改變。


auto是指定占位符類型的關鍵字。 帶有auto的變量的類型是用於初始化變量的值的類型:

auto a = 42;            // a is int, for the entirety of the program
a = std::string{"hi"};  // error, a has type int

這種類型是靜態確定的,即在編譯時,並且在程序執行期間永遠不會改變。


這些構造不可互換,因此它們具有不同的用例,您無法有意義地比較一種與另一種的優缺點。

如果你寫:

auto a = 42;
a = "some string";

你會得到一個編譯錯誤,因為aint類型的變量,你不能給它分配一個字符串。 auto關鍵字只是意味着編譯器將決定為您使用哪種類型。

現在,如果你寫:

std::any a = 42;
a = "some string";

這會起作用,因為a的類型是std::any ,它是一種復雜的類類型,它使用模板在幕后為您存儲任何類型。 不用說,它是一個比int復雜得多的類型,你應該只在絕對必要時使用它。

主要區別是什么?

主要區別在於auto是編譯時的東西,而std::any是運行時的東西,而可以說它們在邏輯上做同樣的事情:它們可以存儲任何類型的變量。

std::any是一種現代且類型安全的構造,適用於您希望擁有其類型可能在運行時更改的變量的情況。 一些示例用例是:

  1. 從可以具有任何類型的文件/GUI 中讀取特定值
  2. 模擬腳本語言的動態類型行為
  3. 包裝來自遺留庫的void*變量的良好且類型安全的候選者

另一方面, auto是一種編譯器機制,在編譯時進行類型推導,並將其用於 auto 之后使用的變量。 換句話說,使用 auto 定義的變量的類型以后不能更改。

auto是不可變的,而std::any是可變的。 這意味着auto是在運行時確定的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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