boost::any_cast(const any&) 使用 const_cast<> -- 这不是潜在的 UB 吗?

boost::any_cast(const any&) uses const_cast<> -- Isn't this potentially UB?

本文关键字:cast const any 这不是 UB lt 使用 boost gt      更新时间:2023-10-16

boost/any.hpp (version 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); }
};

那么,boost是洁食吗?

这是合法的代码,因为any_cast返回const指针,而any_cast接收指针,不改变它的参数。

如果您使用const_cast: ,则标准的

UB只能在一种情况下使用:

n3376 5.2.11/7

[注:根据对象的类型,写操作通过指针、左值或指向数据成员的指针const限定符被强制转换的Const_cast可能产生undefined行为(7.1.6.1)。

也许你正在考虑[expr.const.cast]#7:

[注:根据对象类型的不同,通过const_cast(去掉const限定符73)产生的指针、左值或指向数据成员的指针进行的写操作可能会产生未定义的行为(7.1.6.1)。-end note]

第7.1.6.1节是:

除了任何声明为可变的类成员(7.1.1)都可以被修改之外,任何修改const的尝试对象在其生命周期(3.8)中导致未定义行为

但是在这段代码中没有这样的写操作。[expr.const.cast]部分的其余部分没有说明这段代码有问题。