1

我有一堆联合类(union_a、union_b、...),它们都具有相同的数据成员和不同的成员函数。我希望能够将任何类的对象分配给任何其他类的对象,并在任何 ctor 中使用它进行初始化。“工作”联合 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
4

1 回答 1

4

G++ 是正确的。复制初始化的正式语法是将右边的表达式转换为=目标类型,然后复制它。在这种情况下,假设隐式转换为union_ato union_b。而且没有;唯一的转换需要两个用户定义的转换,并且两个用户定义的转换永远不能用于隐式转换。

请参阅 §8.5/16 和 §13.3.1.4(C++11,但关于早期版本的规则并没有改变)。

于 2013-04-24T17:38:53.877 回答