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 用于引用和指针的主要内容,如果未能解决你的问题,请参考以下文章

C++: 四种强制类型转换

正确使用 const_cast 与第三方库

reinterpret_cast and const_cast

条款二:最好使用c++转型操作符

C++中四种类型转换符:static_castdynamic_castreinterpret_cast和const_cast要点解析

C++标准转换运算符const_cast