auto和std :: any之间有什么区别?

问题描述

我最近遇到了基于std::any在C ++ 17中引入的boost::any类。此类可以“保存任何类型的实例”,并且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";

您会收到一个编译错误,因为a是类型int的变量,并且您不能为其分配字符串。 auto关键字仅表示编译器将决定要使用哪种类型。

现在,如果您写:

std::any a = 42;
a = "some string";

这将起作用,因为a的类型为std::any,这是一种复杂的类类型,它利用模板在后台为您存储任何类型。不用说,它是一种比int更复杂的类型,只应在绝对必要时使用它。

,

主要区别是什么?

主要区别在于auto是编译时事物,而std::any是运行时事物,可以说它们在逻辑上是相同的:它们可以存储任何类型的变量。 / p>