3

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); }
};

那么,boost是犹太洁食吗?

4

2 回答 2

4

这是合法代码,因为any_cast返回 const-pointer 并且any_cast接收指针的 ,不会更改其参数。

如果您使用 UB 按标准只能在 1 种情况下使用const_cast

n3376 5.2.11/7

[注意:根据对象的类型,通过指针、左值或指向数据成员的指针的写操作由 const_cast 产生,该 const_cast 丢弃了 const-qualifier 可能会产生未定义的行为 (7.1.6.1)。——尾注]

于 2014-05-20T08:51:44.927 回答
3

也许你在想[expr.const.cast]#7

[注意:根据对象的类型,通过指针、左值或指向数据成员的指针的写入操作由 const_cast 产生,该 const_cast 丢弃了 const-qualifier 73 可能会产生未定义的行为 (7.1.6.1)。——尾注]

第 7.1.6.1 节是:

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

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

于 2014-05-20T08:52:12.260 回答