[英]What is the difference between `auto` and `std::any`?
我最近遇到了基於boost::any
在 C++17 中引入的std::any
class 。 這個 class 可以“持有任何類型的實例”並auto
推斷變量的數據類型。
那么主要區別是什么? 優缺點都有什么?
std::any
和auto
是完全不同的結構。
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";
你會得到一個編譯錯誤,因為a
是int
類型的變量,你不能給它分配一個字符串。 auto
關鍵字只是意味着編譯器將決定為您使用哪種類型。
現在,如果你寫:
std::any a = 42;
a = "some string";
這會起作用,因為a
的類型是std::any
,它是一種復雜的類類型,它使用模板在幕后為您存儲任何類型。 不用說,它是一個比int
復雜得多的類型,你應該只在絕對必要時使用它。
主要區別是什么?
主要區別在於auto
是編譯時的東西,而std::any
是運行時的東西,而可以說它們在邏輯上做同樣的事情:它們可以存儲任何類型的變量。
std::any
是一種現代且類型安全的構造,適用於您希望擁有其類型可能在運行時更改的變量的情況。 一些示例用例是:
void*
變量的良好且類型安全的候選者另一方面, auto
是一種編譯器機制,在編譯時進行類型推導,並將其用於 auto 之后使用的變量。 換句話說,使用 auto 定義的變量的類型以后不能更改。
auto
是不可變的,而std::any
是可變的。 這意味着auto
是在運行時確定的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.