boost::any_cast(const any&) 使用 const_cast<> -- 这不是潜在的 UB 吗?
boost::any_cast(const any&) uses const_cast<> -- Isn't this potentially UB?
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]
部分的其余部分没有说明这段代码有问题。