问题描述
我最近遇到了基于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
是类型int
的变量,并且您不能为其分配字符串。 auto
关键字仅表示编译器将决定要使用哪种类型。
现在,如果您写:
std::any a = 42;
a = "some string";
这将起作用,因为a
的类型为std::any
,这是一种复杂的类类型,它利用模板在后台为您存储任何类型。不用说,它是一种比int
更复杂的类型,只应在绝对必要时使用它。
主要区别是什么?
主要区别在于auto
是编译时事物,而std::any
是运行时事物,可以说它们在逻辑上是相同的:它们可以存储任何类型的变量。 / p>