【发布时间】:2012-12-25 16:55:56
【问题描述】:
参考 SO C++ 常见问题解答When should static_cast, dynamic_cast and reinterpret_cast be used?。
const_cast 用于将 const 删除或添加到变量中,它是唯一可靠、已定义且合法的删除 const 的方法。 reinterpret_cast 用于改变一个类型的解释。
我以合理的方式理解为什么 const 变量应该仅使用 const_cast 强制转换为非 const,但我无法找出使用 reinterpret_cast 而不是 const_cast 添加 const 的合理理由。
我知道使用 reinterpret_cast 来添加 constness 是不明智的,但是使用 reinterpret_cast 来添加 constness 会是 UB 还是潜在的定时炸弹?
我在这里感到困惑的原因是因为声明
很大程度上,使用 reinterpret_cast 获得的唯一保证是,如果 您将结果转换回原始类型,您将得到准确的 相同的值。
因此,如果我使用 reinterpret_cast 添加 constness,并且如果您将结果 reinterpret_cast 重新转换为原始类型,它应该返回原始类型并且不应该是 UB,但这违反了一个事实,即应该只使用 const_cast 来删除恒常性
在单独的说明中,该标准保证您可以使用重新解释大小写来添加 Constness
5.2.10 Reinterpret cast (7) ......当“pointer to T1”类型的prvalue v转换为“pointer to cv T2”类型时,结果为 static_cast(static_cast(v)) 如果 T1 和 T2 都是 标准布局类型 (3.9) 和 T2 的对齐要求是 不比T1严格…………
【问题讨论】:
-
@clossvoters:您能否请我参考回答此问题的重复问题?
-
const_cast还包括添加/删除volatile。 -
@MikeDeSimone:肯定是的,但我目前的重点只是 constness
-
那个语句应该写成"...如果你
reinterpret_cast把结果变回原来的类型..."
标签: c++ casting constants reinterpret-cast