我有一堆 union 类(union_a, union_b, ...),都具有相同的数据成员和 不同的成员函数。 我希望能够将任何类的对象分配给任何其他类的对象,并且 在任何 ctor 中使用它进行初始化。 “工作” union union_z 用作中介。 在 VC 中一切正常。 在 GC 中,最后一行出现“错误:请求从‘union_a’到非标量类型‘union_b’的转换”。
如果可以,请帮助我,我...
union union_z{int m;};
union union_a{
int m;
union_a(){}
union_a(union_z x){m = x.m;}
void operator=(union_z x){m = x.m;}
operator union_z(){return *(union_z *)this;}
};
union union_b{
int m;
union_b(){}
union_b(union_z x){m = x.m;}
void operator=(union_z x){m = x.m;}
operator union_z(){return *(union_z *)this;}
};
union_a a;
union_b b(a);
b = a;
union_b b1 = a; //error: conversion from ‘union_a’ to non-scalar type ‘union_b’ requested
最佳答案
G++ 是正确的。复制初始化的正式语法是
将 =
右边的表达式转换为目标
键入,然后复制它。在这种情况下,它假设一个隐含的
从 union_a
到 union_b
的转换。没有一个;
唯一的转换需要两个用户定义的转换,
两个用户定义的转换永远不能用在
隐式转换。
参见 §8.5/16 和 §13.3.1.4(C++11,但与此相关的规则 与早期版本相比没有变化)。
关于C++ 不同对象类型之间的赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16198600/