C++ boost::any_cast(const any&;)使用const_cast<>;——Isn';这不可能吗?
boost/any.hpp(版本1.55)定义(第263行)C++ boost::any_cast(const any&;)使用const_cast<>;——Isn';这不可能吗?,c++,boost,boost-any,C++,Boost,Boost Any,boost/any.hpp(版本1.55)定义(第263行) 那么,boost kosher是吗?这是法律代码,因为任何_-cast返回常量指针,而任何接收指针的_-cast不会更改其参数 如果使用const\u cast,则UB按标准只能在1种情况下使用: n3376 5.2.11/7 [注意:根据对象的类型,通过 由 丢弃常量限定符的常量强制转换可能会产生未定义的 行为(7.1.6.1)。-结束注释] 也许您正在考虑[expr.const.cast]#7: [注:根据对象的类型,通过指针、左
那么,boost kosher是吗?这是法律代码,因为
任何_-cast
返回常量指针,而任何接收指针的_-cast
不会更改其参数
如果使用const\u cast
,则UB按标准只能在1种情况下使用:
n3376 5.2.11/7
[注意:根据对象的类型,通过
由
丢弃常量限定符的常量强制转换可能会产生未定义的
行为(7.1.6.1)。-结束注释]
也许您正在考虑
[expr.const.cast]#7
:
[注:根据对象的类型,通过指针、左值或指向数据成员的指针执行的写入操作可能会产生未定义的行为(7.1.6.1)。-结束注]
第7.1.6.1节为:
除了可以修改任何声明为可变(7.1.1)的类成员外,任何修改常量的尝试
对象在其生存期(3.8)内会导致未定义的行为
但是在这段代码中没有这样的写操作。
[expr.const.cast]
部分的其余部分没有说明此代码有问题。您是否在此处引用错误;UB如果我从最初的非常量对象中删除常量?如果函数返回指向非常量值类型的指针,可能会导致UB,但它不是。常进常出。函数中的代码是什么?它只是投射,不修改对象。嗯。我可能被旧的标准误导了。所以const\u cast(非const\u对象)
毕竟不是(潜在的)UB?旧的标准也没有问题
template<typename ValueType>
inline const ValueType * any_cast(const any * operand) BOOST_NOEXCEPT
{
return any_cast<ValueType>(const_cast<any *>(operand));
}
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); }
};