常量强制转换有什么不同
What does a const cast do differently?
const_cast 样式转换(ObjectType)之间有实际区别吗?
const_cast
传达有关强制转换背后的意图的特定信息,而 C 强制转换无法传达。
如果您不小心尝试将const_cast
用于添加或删除const
或volatile
以外的目的,编译器将帮助您处理错误消息。
此外,const_cast
是可搜索的,不像 C 样式的演员表。
const_cast
只能添加或删除const
-ness(或volatile
-ness,尽管这种情况不太常见)。
C 风格的演员可以做与任何"新"演员相同的工作,除了dynamic_cast
(它可以做一些他们都做不到的事情,尽管它在这里并不真正相关)。
C++中的 C 样式强制转换尝试静态强制转换、重新解释转换、const 强制转换或这些转换的组合。
建议避免C型,主要是因为...
- 重新解释 Casts 和 const Cast 很少使用,以至于强调你正在做的事情是件好事,
- 在其他情况下,当您需要静态强制转换时,与 C 强制转换相比,显式编写它可为您提供额外的编译时检查。
相同的操作。C 型铸型可以同样抛弃常量。
const_cast的原因是它可以作为一个可搜索的危险信号,搜索和仔细审查/惩罚有罪的人。这个想法是C++比 C 更严格。因此,故意违反类型系统(例如违反const正确性),如果不是不可能的话,也很容易被发现。
使这种完全不可能违反类型安全的行为会破坏太多的向后兼容性。
const_cast
只能修改参数的常量(或易失性),而不是它的基本类型。所以
const T *tc = f();
volatile T *tv = g();
U *ua = const_cast<U*>(tc); //error
U *ub = const_cast<U*>(tv); //error
U *ub = (U*)(tc); //okay
U *ub = (U*)(tv); //okay
因此,c型铸造将符合cv标准的T*
修改为U*
没有任何问题。
const_cast受到更多限制,除了改变常量之外,不会让你做任何事情。这使得它更安全,即不易发生事故。
此外,它更容易搜索。
相关文章:
- 努力将整数转换为链表。不知道我在这里做错了什么
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 从长整整转换为uint64_t的推荐方法是什么?
- C++:Lambda 函数指针转换的用例是什么?
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- 为什么此指针值不能转换为整数的规则是什么?
- 指针类型类成员的动态强制转换的恒定性是什么?
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 当我使用 void 函数的返回值(通过强制转换函数指针)时,究竟会发生什么?
- 从二进制流中读取时,将双精度变量的地址转换为 char* 意味着什么?
- 使用 CStringW/CStringA 和 CT2W/CT2A 转换字符串有什么区别?
- 将QGyroscopeReading转换为QVector3D的正确方法是什么?
- C++ C4244 =':从"std::streamsize"转换为"无符号短",可能会丢失数据;有什么解决办法吗?
- 在从 C++ 转换为 C# 的代码中,我应该使用什么而不是 memcpy?
- 在C++中将uint64_t转换为void类型的目的是什么
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 这个typedef和转换运算符语法是什么意思
- 是什么将程序集转换为实际可执行的材料
- 转换为非标量误差是什么意思?我该如何解决?
- 在 OpenGL 中计算矩阵时,转换的正确顺序是什么?