交换工会的正确方法?

Eva*_*ran 3 c++ swap unions

我有一个班级,其中有一个联盟作为其成员之一.我也是复制/交换习语的忠实粉丝.在我看来,交换工会似乎没有任何正确的(在标准意义上)!

这是我能想到的最好的:

char tmp[sizeof(U)];
memcpy(tmp, &u1, sizeof(U));
memcpy(&u1, &u2, sizeof(U));
memcpy(&u2, tmp, sizeof(U));
Run Code Online (Sandbox Code Playgroud)

由于工会(至少在c ++ 03中)要求所有成员都是POD,我不明白为什么这不起作用.但它感觉不对.交换工会有更正确的方法吗?它似乎几乎被忽视了.

你们有什么感想?

编辑:

好的,看到给出的解决方案后,我觉得有点愚蠢:-).我写下了传统的解决方案,比如std::swap和分配,因为当我第一次编写代码时,联合是一个匿名联盟.在当前版本的代码中,联合不再是匿名的,传统的解决方案似乎工作得很好.谢谢.

Jan*_*dec 6

只是:

#include <algorithm>
std::swap(u1, u2);
Run Code Online (Sandbox Code Playgroud)

联合是可复制构造和可分配的,因此没有问题.

  • @Evan Teran:§14.3.1[temp.arg.type]/2*本地类型,没有链接的类型,**未命名类型**或由这些类型中的任何一种组合的类型**不得**用作模板类型参数的模板参数**.*基本上是的,你不能使用*unnamed*union作为模板的类型参数,而`std :: swap`是一个模板. (3认同)