【问题标题】:What is the difference between `auto` and `std::any`?`auto` 和 `std::any` 有什么区别?
【发布时间】:2020-10-19 16:18:34
【问题描述】:

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

那么主要的区别是什么?有什么好处和坏处?

【问题讨论】:

  • 它们不可比较,因为它们不可互换。没有优点和缺点。 auto 对象的类型在编译期间被解析。 std::any 帮助的对象类型不是。
  • 两个非常不同的东西。没有有意义的方法来比较它们。
  • 我没有投反对票,但这个问题没有显示任何研究。即使是像谷歌搜索这样的最小研究也能回答它
  • std::any 与 auto 无关。它更类似于 std::variant。见C++ std::variant vs std::any

标签: c++ c++17 auto stdany


【解决方案1】:

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

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


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

【讨论】:

  • 奇怪的是我们如何使用相同的变量名和相同的整数值。我猜 42 很特别。
  • @lvella 不太奇怪 :) a 是字母表中的第一个字符,42 肯定是特殊的 :)
  • @lvella 另外,auto 和 any 都以 a 开头,所以这解释了很多 :) 我认为这至少对我来说可能是一种潜意识的偏见。
【解决方案2】:

如果你写:

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

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

现在,如果你写:

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

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

【讨论】:

    【解决方案3】:

    主要区别是什么?

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

    【讨论】:

    • 我对“逻辑上做同样的事情”这个措辞不太满意。你能扩展一下你的意思吗? auto 只能容纳一种类型。
    • 我的意思是 OP 可能注意到他们可以写 auto a = 42 或 std::any a = 42。这似乎两个陈述做相同或几乎相同的事情。但这并不是因为第一个是在编译时完成的,第二个是在运行时完成的。
    • 是的,所以逻辑上不是一回事,对吧?即使它看起来那样。
    • 不,它们在逻辑上看起来相同,但由于我提到的差异,它们不可能完全相同。
    • 逻辑上仍然不是正确的词。您可能意味着它们在语法上相同,但在语义上(这是语句的逻辑)不同。
    猜你喜欢
    • 2017-10-19
    • 2019-06-07
    • 1970-01-01
    • 2015-07-12
    • 2019-11-19
    • 2022-12-03
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多