[英]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.