一位初级开发人员问我,是否可以用POD参数重载联合的赋值操作符,以便当联合的实例被分配给该类型的变量时,联合中的相应数据类型将被写入。我回答说我不这么认为,但随后使用了以下代码。令我惊讶的是,这段代码实际上是经过编译的(使用Ubuntu12.04上的g++版本4.6.3 )
union unMember
{
float fData;
unsigned int uiData;
unMember():uiData(0) {};
unMember(float data):fData(data) {};
unMember(unsigned int data):uiData(data) {};
operator float() {return fData;};
operator unsigned int() {return uiData;};
unMember& operator=(float data) {fData = data;return *this;};
unMember& operator=(unsigned int data) {uiData = data; return *this;};
float GetFloat() const {return fData;};
};
int main () {
float fTest = 1.0;
unsigned int uiTest = 10;
unMember data = fTest;
unMember data2 = uiTest;
unMember data3 = data2;
float f = data.GetFloat();
return 0;
}
这让我意识到,我对联合几乎一无所知(至少在C++而不是C的上下文中是如此),因为我真的没有想到能够以这种方式为联合定义成员函数。上面的代码告诉我,在C++中,联合是作为一个类在内部实现的,但在C++标准中实际上是这样的吗,或者这只是g++编译器的某种怪癖?
此外,由于这真的动摇了我对工会是什么的理解,我欢迎任何意见,以这种方式实现工会的成员职能是否可取?在我的联合的上述实现中,有没有什么本质上不安全的地方?
在过去,我只在容器类中使用联合,容器类有一个指示器变量,用于存储联合中实际写入的类型,老实说,我认为这是它们的主要用途。以这种方式重载联合的构造函数等真的很常见吗?
https://stackoverflow.com/questions/23932389
复制相似问题