问题标签 [const-cast]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Bruce Eckel 书中的这个例子中的 const_cast 做了什么?
我正在学习基于“用 C++ 思考”的入门级 C++ 课程。请原谅我可能错过了明显的:
我的系统返回:
'0x22ff74,0,0x22ff74,5'
我只声明了两个变量,一个包含一个 int,一个包含指向同一个 int 的指针。我认为 const_cast 是“从 const 转换为 nonconst”。那么 cout 如何找到三个不同的值呢?
c++ - const_cast 转换为左值引用不会删除 constness
我想了解以下两种情况的区别。
结果:
0
然而,
我得到:
1
关于第一种情况,为什么“v0”保持为0?
提前致谢。
c++ - 为什么 const 方法不能返回非常量引用?
为什么下面的方法不能getRanks()
编译,我该如何优雅地修复它?
我想要做的就是定义一个返回成员引用的成员访问器方法。参考不是const
因为我稍后可能会修改它所指的内容。但是由于成员方法没有修改对象,所以我声明它const
。编译器(clang,std=c++11)然后坚持认为存在“删除限定符”的“引用绑定”。但我不会放弃预选赛,是吗?如果我是,为什么:
现在,如果我更改 return 语句以丢弃 const,则代码编译:
但是“排名”首先不应该是 const ,我不明白为什么我需要 const_cast const 。我什至不知道这样做是否安全。
无论如何,有没有更清洁的人来写这个方法?有人可以解释为什么这种简单的常识方法会失败吗?我确实想声明getRanks()
方法“ const
”,以便我可以从其他const
方法调用它。
c++ - 最初宣布为不断的混乱
const_cast
仅当您强制转换最初是非常量的变量时才是安全的。
文字是最初声明为常量的唯一数据吗?如果没有,任何人都可以举出最初声明的 const 数据场景的例子吗?
c++ - 这是 const_cast 的未定义行为吗?
这里发生了什么?
我的编译器输出 0 和 1,但“a”的地址和“p”的值是相同的,所以我很困惑这怎么可能。
c++ - 使用 const_cast 忽略 volatile?
const_cast
也可以用来忽略对象是 的事实volatile
。但是,这实际上意味着什么?我想不出一个你会const_cast
在volatile
变量上使用 a 的例子?
c++ - 是否可以定期使用 const_cast 作为设计工具?
我查看了下面的代码类型,虽然我对问题 (*) 有个人答案,但我想听听 C++/设计专家的意见。
出于某种原因,Data
是一个具有不可修改标识符和可修改值的对象:
设计选择变成了语言选择,因为标识符是const
在类级别 (**) 声明的,以避免其(意外)修改,即使是从类成员函数内部...
...但是如您所见,有一个复制赋值运算符,其实现为:
复制赋值运算符不是 const 限定的事实使此代码安全(用户只能在非 const 对象上合法地调用此方法而不会引发未定义的行为)。
但是const_cast
,在 C++ 中使用修改其他 const 成员变量是一个不错的类设计选择吗?
我想强调以下几点:
- 数据显然是一个值类型(它有一个
operator =
成员函数) - 在这种模式中,其他一些函数也可能合法地需要
const_cast
(例如,移动构造函数/赋值和/或交换函数),但不是很多。
请注意,这可能是一个代码审查问题,但这不是“日常”代码。这是一个通用的 C++ 类型设计问题,需要平衡语言的需求/功能和模式/习语的代码解释。
还要注意,这mutable
(如在 C++98 中)不是问题的解决方案,因为其目的是使成员变量尽可能地不可修改。当然,mutable
(如在 C++11 中,Herb Sutter 的“你不知道const
和mutable
”)更不是一个解决方案。
(*) 我可以私下将我对该问题的回答转发给任何提问的人。
(**) 另一种解决方案是使对象非 const,并在接口级别使其成为 const(即不提供可以更改它的函数)
c++ - 在 this-> 指针上应用 const_cast
我正在使用一些代码来消除变量的恒定性。
它按预期工作,但是当我尝试删除“this”指针的恒定性时,编译器不允许它,即它在 const_cast 语句下方显示波浪线。
当我将鼠标(我使用 VS2014)悬停在早期代码中的“this”和“iptr”上时,我可以看到类型相同,即<classname> *const
谁能解释一下引擎盖下发生了什么?
干杯,
萨克特
c++ - const_cast 不能改变变量?
这是测试代码:
它打印
22ff18 22ff18 10 3
我想知道为什么 *b 和 print 不同的答案?它共享相同的地址!
c++ - 指向成员的指针上的 const_cast 是否安全?
在下面的代码中,const
一个对象的非方法调用const
相同对象的一个方法,该方法返回一个const
指向对象字段的指针,然后这个返回的指针被强制转换为一个非const
版本——这是一种类似于这个答案:优雅的解决方案来复制,const 和 non-const,getter?[重复]。但是,由于我将指针放入复杂的数据结构中,我不确定它是否真的有效。会吗?