专栏首页C++核心准则原文翻译C++核心准则C.181:避免使用"暴露的"联合体

C++核心准则C.181:避免使用"暴露的"联合体

C.181: Avoid "naked" unions

C.181:避免使用"暴露的"联合体

Reason(原因)

A naked union is a union without an associated indicator which member (if any) it holds, so that the programmer has to keep track. Naked unions are a source of type errors.

暴露的联合体指的是不包含用来表示哪个(如果存在的话)成员有效的标志的联合体,程序员必须对数据流保持跟踪。暴露状态的联合体是错误的源头之一。

Example, bad(反面示例)

union Value {
    int x;
    double d;
};

Value v;
v.d = 987.654;  // v holds a double

So far, so good, but we can easily misuse the union:

到目前为止还好,但是我们会很容易地错误使用这个联合体:

cout << v.x << '\n';    // BAD, undefined behavior: v holds a double, but we read it as an int

Note that the type error happened without any explicit cast. When we tested that program the last value printed was 1683627180 which is the integer value for the bit pattern for 987.654. What we have here is an "invisible" type error that happens to give a result that could easily look innocent.

注意类型错误是在没有任何显式类型转换的情况下发生的。但我们测试这段程序的时候,输出的最后一个值是1863627180,它是987.654的二进制对应的整数值。我们在这里遇到的是一个"不可见"类型错误,它恰巧给出一个很容易被判断为没有问题的结果。

And, talking about "invisible", this code produced no output:

另外,谈到"不可见",下面的代码不会产生输出:

v.x = 123;
cout << v.d << '\n';    // BAD: undefined behavior
Alternative(可选项)

Wrap a union in a class together with a type field.

将联合体和一个类型字段封装为一个类。

The C++17 variant type (found in <variant>) does that for you:

C++17的variant类型(可以在<variant>中找到)可以为你做同样的事:

variant<int, double> v;
v = 123;        // v holds an int
int x = get<int>(v);
v = 123.456;    // v holds a double
w = get<double>(v);
Enforcement(实施建议)

???

原文链接:

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c181-avoid-naked-unions


觉得本文有帮助?请分享给更多人。

关注【面向对象思考】轻松学习每一天!

面向对象开发,面向对象思考!

本文分享自微信公众号 - 面向对象思考(OOThinkingDalian),作者:面向对象思考

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++核心准则ES.106:不要试图通过使用无符号类型避免负值

    Choosing unsigned implies many changes to the usual behavior of integers, includ...

    面向对象思考
  • C++核心准则ES.101:使用无符号类型进行位操作

    ES.101: Use unsigned types for bit manipulation

    面向对象思考
  • C.43:保证(值类型)可拷贝类有默认构造函数

    Many language and library facilities rely on default constructors to initialize...

    面向对象思考
  • PAT 1012 The Best Rank

    1012. The Best Rank (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B ...

    ShenduCC
  • DWORD WORD到INT的转换

    首先,如果是在网络传输、消息解析的情况下,要注意一下网络传送使用的是大端还是小端模式,这影响到我们的高低位的传输顺序。

    Rekent
  • UNPv1第三章:套接字编程简介

    1).IPv4套接字地址结构 IPv4套接字地址结构通常也称为“网际套接字地址结构”,它以sockaddr_in命名,定义在

    提莫队长
  • js引擎v8源码解析之token(基于0.1.5)

    theanarkh
  • netty源码分析四之客户端接入与数据写出

    在上文Bootstrap初始化流程分析中我们知道,在NioServerSocketChannel进行register时,会调用eventLoop.execute...

    开发架构二三事
  • 深入浅出iOS内存管理-技术创作101训练营

    在这篇文章中,我会总结最近对iOS开发内存课题的查阅和学习,文章的中心还是围绕着面试题来的。因为网上目前确实存在着很多的面试题和答案,但他们大多数都是拷贝粘贴,...

    筑梦师winston
  • 【python-leetcode207-拓扑排序】课程表

    你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。

    绝命生

扫码关注云+社区

领取腾讯云代金券