繁体   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