6

我最近遇到了这个std::any类,在 C++17 中引入,基于boost::any. 这个类可以“持有任何类型的实例”并auto自动推导出变量的数据类型。

那么主要区别是什么?优缺点都有什么?

4

3 回答 3

19

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

这种类型是静态确定的,即在编译时,并且在程序执行期间永远不会改变。


这些构造不可互换,因此它们具有不同的用例,您无法有意义地比较一种与另一种的优缺点。

于 2020-10-19T16:25:52.457 回答
4

如果你写:

auto a = 42;
a = "some string";

你会得到一个编译错误,因为a它是 type 的变量int,你不能给它分配一个字符串。关键字只是意味着编译器将auto决定为您使用什么类型。

现在,如果你写:

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

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

于 2020-10-19T16:33:26.237 回答
0

主要区别是什么?

主要区别在于这auto是编译时的事情和std::any运行时的事情,而可以说它们在逻辑上做同样的事情:它们可以存储任何类型的变量。

于 2020-10-19T16:34:31.137 回答