Почему для s td:: any нет unsafe_any_cast?

Моя локальная версия заголовков 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 ответ

Решение

std::any является типобезопасным контейнером для отдельных значений любого типа.

Обратите внимание на комментарий в фрагменте, который вы разместили, что Boost's unsafe_any_cast не является частью общедоступного интерфейса. Это деталь реализации, и она не предназначена для использования конечным пользователем. Вот почему это не упоминается в документации.

Продвижение его в общедоступный интерфейс нарушило бы цель, прежде всего, создать контейнер с безопасным типом.

Другие вопросы по тегам