为什么std :: swap不能在std :: aligned_union上工作

时间:2016-05-01 10:22:34

标签: c++ c++11

以下代码不太有用。

#include <type_traits>
#include <string>
#include <iostream>

template<std::size_t Len, class... Types>
using dataType = typename std::aligned_union<Len,Types...>::type;

int main()
{
    dataType<1,int,float,std::string,char,bool> x;
    dataType<1,int,float,std::string,char,bool> y;

    new (&x) std::string("chicken");
    new (&y) std::string("boiled");

    std::swap(x,y);

    std::cout << *reinterpret_cast<std::string*>(&x) << " " << *reinterpret_cast<std::string*>(&y) << std::endl;
}
例如,它打印chicke boiled而没有n。它还没有交换xy,否则会打印boiled chicken

1 个答案:

答案 0 :(得分:2)

这不可行。交换的正确行为需要知道union包含哪种类型。这不是一个有区别的联合,因此任何依赖于知道联合包含哪种类型的操作都将失败,除非特别提供该信息。

我很想知道你怎么想象这可能会起作用,甚至可以想象。你认为std::swap可能做什么魔术?