新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要讲解了“C++为什么不使用联合体实现双关类型”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++为什么不使用联合体实现双关类型”吧!
成都创新互联-专业网站定制、快速模板网站建设、高性价比汾阳网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式汾阳网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖汾阳地区。费用合理售后完善,10年实体公司更值得信赖。
C.183: 不要使用联合体实现双关类型
向联合体的一个类型的成员写入,然后从联合体不同类型的另一个成员读出数据的行为是没有定义的。这样的双关性操作无法发现,或者至少比使用命名转换更难发现。使用联合体实现双关类型是错误的源头。
Example, bad(反面示例)
union Pun {
int x;
unsigned char c[sizeof(int)];
};
Pun的想法是可以观察整数的字节表现。
void bad(Pun& u)
{
u.x = 'x';
cout << u.c[0] << '\n'; // undefined behavior
}
如果你希望看到整数的各个字节,使用(命名)转换:
void if_you_must_pun(int& x)
{
auto p = reinterpret_cast(&x);
cout << p[0] << '\n'; // OK; better
// ...
}
使用reinterpret_case将一个对象从它被定义的类转换为不同的类型之后访问其结果是被定义的行为(即使是这样也不推荐使用reinterpret_cast),但是至少我们可以看到某些危险的处理正在进行。
Note(注意)
不幸的是,联合体经常被用于双关类型。我们不认为“有时会按照预期动作”是一个很有力的观点。C++17引入了新类型std::byte以协助表现针对原始对象的操作。在这些操作中应该使用std::byte而不是unsigned char。
感谢各位的阅读,以上就是“C++为什么不使用联合体实现双关类型”的内容了,经过本文的学习后,相信大家对C++为什么不使用联合体实现双关类型这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!