我有一个如下所示的 union :
union {
int intValue;
double doubleValue;
std::string stringValue;
void *pointerValue;
} values;
当我编译它时,我得到了这个错误信息(是的,我做了 #include <string>
):
./Value.hh:19:19: error: union member 'stringValue' has a non-trivial copy constructor
std::string stringValue;
^
/Developer/SDKs/MacOSX10.7.sdk//usr/include/c++/4.2.1/bits/basic_string.h:434:7: note: because
type 'std::basic_string<char>' has a user-declared copy constructor
basic_string(const basic_string& __str);
^
我使用这个命令编译它:
$ clang++ *.cc -isysroot /Developer/SDKs/MacOSX10.7.sdk/ -shared
如何使用 std::string
在 union 中?
最佳答案
你不能。
union 结合了两个功能:存储可能是选定数量类型的对象的能力,以及在这些类型之间有效(和实现定义)转换的能力。您可以放入一个整数并将其表示为 double 。以此类推。
因为 union 必须支持两种这些功能(以及其他一些原因,比如能够构建一个), union 会阻止您做某些事情。也就是说,您不能将“事件”对象放入其中。任何“活着”到需要非默认复制构造函数(以及许多其他限制)的对象都不能成为 union 的成员。
毕竟, union 对象并没有真正存储它实际存储哪种类型数据的概念。它不存储一种类型的数据;它同时存储所有。能否钓出正确的类型取决于您。那么它如何合理地将一个 union 值复制到另一个 union 值中呢?
union 的成员必须是 POD(plain-old-data)类型。尽管 C++11 确实放宽了这些规则,但对象仍然必须有一个默认(或其他无关紧要的)复制构造函数。并且 std::string
的复制构造函数是不平凡的。
您可能想要的是 boost::variant
.那是一个可以存储多种可能类型的对象,就像 union 一样。然而,与 union 不同的是,它是类型安全的。因此它知道 union 中的实际内容;因此它能够复制自身,并且在其他方面表现得像一个普通的 C++ 对象。
关于c++ - union 成员有一个重要的复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7299171/