我最近遇到了这个std::any
类,在 C++17 中引入,基于boost::any
. 这个类可以“持有任何类型的实例”并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
它是 type 的变量int
,你不能给它分配一个字符串。关键字只是意味着编译器将auto
决定为您使用什么类型。
现在,如果你写:
std::any a = 42;
a = "some string";
这将起作用,因为 is 的类型a
是std::any
一种复杂的类类型,它利用模板在幕后为您存储任何类型。不用说,它是一种比 复杂得多的类型int
,您应该只在绝对必要时使用它。
主要区别是什么?
主要区别在于这auto
是编译时的事情和std::any
运行时的事情,而可以说它们在逻辑上做同样的事情:它们可以存储任何类型的变量。