[英]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.