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]
В разделе ничего не говорится о том, что у этого кода есть проблема.