为什么std :: any没有unsafe_any_cast?

时间:2018-01-17 13:32:03

标签: c++ boost c++17 stdany

我的本​​地版Boost标头(1.56.0)具有boost/any.hpp中定义的以下功能,逐字复制:

// Note: The "unsafe" versions of any_cast are not part of the
// public interface and may be removed at any time. They are
// required where we know what type is stored in the any and can't
// use typeid() comparison, e.g., when our types may travel across
// different shared libraries.
template<typename ValueType>
inline ValueType * unsafe_any_cast(any * operand) BOOST_NOEXCEPT
{
    return &static_cast<any::holder<ValueType> *>(operand->content)->held;
}

template<typename ValueType>
inline const ValueType * unsafe_any_cast(const any * operand) BOOST_NOEXCEPT
{
    return unsafe_any_cast<ValueType>(const_cast<any *>(operand));
}

即使在线文档甚至不承认它们的存在:http://www.boost.org/doc/libs/1_59_0/doc/html/any/reference.html

我注意到std::any似乎也不支持任何不安全的演员。

为什么C ++ 17标准不会引入std::unsafe_any_cast

如果找不到确切的原因(或者根本就没有提出),那么最不引人注目的论点就是不提供对std::any对象中存储的值的不安全访问?

1 个答案:

答案 0 :(得分:5)

std::any类型安全的容器,适用于任何类型的单个值。

请注意,您发布的代码段中的评论中,Boost的unsafe_any_cast 不是是公共界面的一部分。它是一个实现细节,并不意味着最终用户使用。这就是为什么文档中没有提到它。

将其提升到公共界面会破坏首先拥有类型安全容器的目的。