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

时间:2014-05-20 08:42:29

标签: c++ boost boost-any

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 个答案:

答案 0 :(得分:4)

这是合法代码,因为any_cast返回const-pointer和any_cast,它接收指针,不会改变其参数。

如果您使用const_cast

,则标准UB只能在1种情况下使用

n3376 5.2.11 / 7

  

[注意:根据对象的类型,通过写操作   由a产生的数据成员的指针,左值或指针   抛弃const限定符的const_cast可能会产生undefined   行为(7.1.6.1)。 - 结束说明]

答案 1 :(得分:3)

也许您正在考虑[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]部分的其余部分没有说明此代码存在问题。