boost::any_cast(const any&) использует const_cast<> - разве это не UB?

boost/any.hpp (версия 1.55) определяет (строка 263)

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

Однако, используя const_cast<>, может привести к неопределенному поведению, если исходный объект не был объявлен const как в

class foo
{
  boost::any value;
  template<typename T>
  foo(T const&x) noexcept : value(x) {}

  template<typename T>
  const T*ptr() const noexcept
  { return boost::any_cast(value); }
};

Итак, является ли повышение кошерным?

2 ответа

Решение

Это правовой кодекс, так как any_cast возвращает const-указатель и any_cast, который получает указатель, не меняет своего аргумента.

UB по стандарту может быть только в 1 ситуации, если вы используете const_cast:

N3376 5.2.11 / 7

[Примечание: в зависимости от типа объекта операция записи через указатель, lvalue или указатель на элемент данных, полученный в результате const_cast, который отбрасывает квалификатор const, может привести к неопределенному поведению (7.1.6.1). - конец примечания]

Может быть, вы думаете о [expr.const.cast]#7:

[Примечание: В зависимости от типа объекта операция записи через указатель, lvalue или указатель на элемент данных, полученный в результате const_cast, который отбрасывает квалификатор const 73, может привести к неопределенному поведению (7.1.6.1). —Конечная записка]

Раздел 7.1.6.1 это:

За исключением того, что любой член класса, объявленный mutable (7.1.1), может быть изменен, любая попытка изменить объект const в течение его времени жизни (3.8) приводит к неопределенному поведению

Но в этом коде нет такой операции записи. Остаток от [expr.const.cast] В разделе ничего не говорится о том, что у этого кода есть проблема.

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