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); }
};
那么,是推动犹太人吗?
答案 0 :(得分:4)
这是合法代码,因为any_cast
返回const-pointer和any_cast
,它接收指针,不会改变其参数。
如果您使用const_cast
:
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]
部分的其余部分没有说明此代码存在问题。