c ++将联合转换为其成员类型之一

Bar*_*uch 4 c++ casting unions

以下似乎对我来说是完全符合逻辑的,但是无效的c ++.联合不能隐式地转换为其中一个成员类型.任何人都知道一个很好的理由吗?

union u {
  int i;
  char c;
}
function f(int i) {
}
int main() {
  u v;
  v.i = 6;
  f(v);
}
Run Code Online (Sandbox Code Playgroud)

并且任何人都可以建议一个干净的替代品(我能想到的最干净的是f(v.i);,我承认它非常干净,但上面看起来更干净)

650*_*502 12

虽然同意Crazy Eddie认为它对我来说看起来不那么好,但实际上你可以通过定义它来获得隐式转换:

union u {
    int i;
    char c;
    operator int () const { return i; }
    operator char () const { return c; }
};
Run Code Online (Sandbox Code Playgroud)


Ben*_*igt 5

之所以不能隐式使用(默认情况下),是因为它可能不明确。拥有多个相同类型的成员是完全合法的,并且没有理由偏爱其中之一。

union u
{
    char c;
    TCHAR t;
    wchar_t w;
    int i;
};
void f(TCHAR);

u v;
f(v); // which member should be used?
Run Code Online (Sandbox Code Playgroud)

  • 如果存在一个或多个相同类型的成员,则编译器使用哪一个并不重要,因为它们都占用完全相同的空间。 (7认同)
  • @dreamlax:在所有实际实现中,这是一个有效的观点。不幸的是,根据标准,这确实很重要。 (4认同)