繁体   English   中英

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

[英]boost::any_cast(const any&) uses const_cast<> — Isn't this potentially 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 ,则使用const_cast<> 可能会导致未定义的行为

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

那么,是提升犹太人吗?

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

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

n3376 5.2.11 / 7

[注意:根据对象的类型,通过指针,左值或指向数据成员的指针的写入操作会导致const-qualifier的const_cast产生未定义的行为(7.1.6.1)。 - 结束说明]

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

[注意:根据对象的类型,通过指针,左值或指向数据成员的指针的写入操作可以产生未定义的行为(7.1.6.1)。 - 尾注]

7.1.6.1节是:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM