`boost::any` 和 `std::any` 之间的区别

Posted

技术标签:

【中文标题】`boost::any` 和 `std::any` 之间的区别【英文标题】:Differences between `boost::any` and `std::any` 【发布时间】:2018-08-23 00:55:32 【问题描述】:

C++17 引入了对象容器std::any,基于boost 库boost::any。 我的问题是:标准化的any是否等同于boost版本,还是有区别?

similar question has been posted about variant,在这种情况下存在一些差异,但我找不到关于 any 的参考资料。


编辑:我可以看到的一个区别是方法 emplace 的可用性。我对行为和保证之间的差异感兴趣的不仅仅是 API 的差异。例如,不同的分配对我来说很重要。

【问题讨论】:

如果内存分配和间接是一个问题,你根本不应该使用any 可能重复:***.com/questions/41878040/… @MaximEgorushkin:他们不是问题,但我想知道在什么情况下会发生什么。 【参考方案1】:

我对行为和保证之间的差异感兴趣。

没有任何行为差异;并不真地。它们都对 ValueType 有相同的要求(可复制构造,以及不发出异常的析构函数)。它们都对存储的值提供相同的操作,并提供几乎相同的异常保证。

主要区别在于boost::any的实现目前没有实现小对象优化,而std::any的实现可能提供。

【讨论】:

感谢您的回答。 answer in the linked question 说 boost 从不应用小对象优化。这个答案是一年前的。与此同时,Boost 实施是否改变了我? boost::any 没有实现小对象优化。 感谢您编辑答案。你知道标准库是否实现了小对象优化?

以上是关于`boost::any` 和 `std::any` 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

用于异构POD类型的C ++容器

为啥 `boost::any` 比 `void*` 更好?

boost::ptr_vector 和 boost::any 的问题

带有 std::any 和 std::optional 的 any_cast

如何定义 boost::any 运算符 ==

boost::any_cast 到我的自定义类