C++ C++;不同对象类型之间的赋值

C++ C++;不同对象类型之间的赋值,c++,class,variable-assignment,C++,Class,Variable Assignment,我有一堆联合类(联合a,联合b,…),都有相同的数据成员和 不同的成员功能。 我希望能够将任何类的对象分配给任何其他类的对象,并且 在init的任何构造函数中使用它。 “工作”工会被用作调解人。 在VC中一切都很好。 在GC中,最后一行获取“错误:请求从'union_a'转换为非标量类型'union_b' 如果你能帮助我,我 union union_z{int m;}; union union_a{ int m; union_a(){} union_a(union_

我有一堆联合类(联合a,联合b,…),都有相同的数据成员和 不同的成员功能。 我希望能够将任何类的对象分配给任何其他类的对象,并且 在init的任何构造函数中使用它。 “工作”工会被用作调解人。 在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\u a
转换为
union\u b
。没有一个; 唯一的转换需要两个用户定义的转换, 并且两个用户定义的转换永远不能用于 不合法的转换

参见§8.5/16和§13.3.1.4(C++11),但与此相关的规则
与早期版本相比没有变化)

G++是正确的。复制初始化的形式语法是 将
=
右侧的表达式转换为目标 键入,然后复制它。在这种情况下,假设 从
union\u a
转换为
union\u b
。没有一个; 唯一的转换需要两个用户定义的转换, 并且两个用户定义的转换永远不能用于 不合法的转换

参见§8.5/16和§13.3.1.4(C++11),但与此相关的规则
与早期版本相比没有变化)

两个用户定义的隐式转换,对吗<代码>接头b b1=静态铸件(a)有效。您可以添加相关段落:[dcl.init]/17-6-1@jrok对显式转换不能是隐式转换的一部分。@jrok和in
union_b b1=static_cast(a)
,右侧表达式的类型为
union_z
(由于显式转换)。因此,将其转换为
union\u b
@JamesKanze只涉及一个用户定义的转换是的,我知道。我想你会提到这是OP的一个解决方法:)两个隐式用户定义转换,对吗<代码>接头b b1=静态铸件(a)有效。您可以添加相关段落:[dcl.init]/17-6-1@jrok对显式转换不能是隐式转换的一部分。@jrok和in
union_b b1=static_cast(a)
,右侧表达式的类型为
union_z
(由于显式转换)。因此,将其转换为
union\u b
@JamesKanze只涉及一个用户定义的转换是的,我知道。我想你会提到这一点,作为OP的解决办法:)