boost :: any_cast (const any & amp;) использует const_cast & lt; & gt; — Разве это не потенциально 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); }
};

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

3

Решение

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

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

N3376 5.2.11 / 7

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

Другие решения

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

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

Раздел 7.1.6.1 это:

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

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

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector