const_cast 用于引用和指针
Posted
技术标签:
【中文标题】const_cast 用于引用和指针【英文标题】:const_cast for references and pointers 【发布时间】:2018-02-05 13:37:56 【问题描述】:我看到了这个post,它解释了const_cast<>
,并说在使用指针/引用时它是有益的。但是,请考虑以下代码:
1-
const_cast<SCOTCH_Num*>(xadj)
我得到invalid const_cast from type 'cost label* aka const long int *' to type 'SCOTCH_Num* aka int*'
。因此,指针被强制转换。不是吗?
和
2-
(SCOTCH_Num*)(xadj)
我得到warning: use of old-style cast [-Wold-style-cast]
您可能会询问变量定义,但错误中的aka
部分很清楚。如果我有更详细的建议,请告诉我。
【问题讨论】:
C 中没有const_cast
这样的东西。因此,我认为您谈论的是 C++。
有益可能不是正确的词。这是唯一有用的情况,但没有任何好处。
除此之外,我不明白你的问题。我考虑了这两个代码示例,不是什么?
@StoryTeller:见第一个代码。因此,指针被强制转换。不是吗?那为什么会出错呢?
@mahmood const_casts 用于改变常量;但是 static_cast 用于更改类型。
【参考方案1】:
const_cast
仅用于修改指向同一类型的指针上的 const 或 volatile 限定符。您不能使用它在不相关的指针类型之间进行转换。 long int *
是指向与int*
不同的对象类型的指针,因此const_cast
的格式不正确。这很好,因为你不应该在做这种有风险的事情时不知所措。
c 风格的转换几乎可以不惜任何代价进行转换。这是一个不关心类型系统的生硬工具。 C++ 为不同场景引入不同类型的强制转换的全部原因是为了避免这种“不惜一切代价进行强制转换”的行为。这是为了在铸造时给予程序员控制和精确度。
【讨论】:
您可能想要添加 “通过非 const 访问路径修改 const 对象并通过非易失性左值引用易失性对象会导致未定义的行为。” @RichardCritten - 我不是真的,因为这不是问题的主题。我宁愿保持重点,这就是演员本身。由于严格的混叠,如果我们也使用 C 样式转换的结果,则可能存在 UB。深入研究也是一个切线。以上是关于const_cast 用于引用和指针的主要内容,如果未能解决你的问题,请参考以下文章
reinterpret_cast and const_cast
C++中四种类型转换符:static_castdynamic_castreinterpret_cast和const_cast要点解析