|
发表于 2020-6-7 18:45:02
|
显示全部楼层
我觉得首先应该想到,C++语言中的union和位域,在很大程度上是为了兼容C而留下的,这一事实本身就容易导致语言的设计者只是想兼容它们,而并不想让他们再跟语言的其它特性“完美地”融合在一起,换句话说,在保证最大程度兼容的基础上,别惹麻烦就可以了,越简单越好。
关于引用,非POD类可否作union的成员,这个应该随便就可以想出一大堆否定的理由,比如:
(1)引用在语法上是另一个对象的别名,那么,你如何想象一个union实例,它可以是个int,同时又可以是一个“double的别名”?(这比“可以是int,同时也可以是个double”难理解多了)
(2)定义一个union实例一般不带显式初始化的,那么你如何像它的某个成员(同时也是其它所有成员的共同载体)却必须在定义时明确初始化?
(3)operator=的处理过程中往往会先清理先前的对象内容,如何让一个成员负责清理另一个成员的信息?
(4)共享着同一块内存的两个对象若都有析构函数,那么整个union实例终止时,析构谁呢?
(5)同样,创建一个union实例时,默认又调用谁的构造函数呢?
(6)如果其中某一个成员没有默认构造函数又怎么办?
总之,非POD的对象本来就可能无比复杂,“两个对象共用同一块内存”,天哪,——还是不要继续想下去了吧。:P
union中不能有static成员,一可能是为了兼容,二也确实意义不大。位域也同样吧。
C++兼容了它们,同时当然也要尽量不改变它们在C语言中被设计出来时的设计初衷。(想想在C语言中,位域和union都是做啥用的?为union加上一个static成员,或者让位域作static成员,应该都是当初它们的设计者所从未考虑过的事情) |
|