c++ - union 成员有一个重要的复制构造函数

标签 c++ string constructor

我有一个如下所示的 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/

相关文章:

c++ - 如何在 C++ 中接受用户的二进制输入?

c++ - C 中按 "a A b B c C"顺序对字符串数组进行排序

c++ - SFINAE 上的默认参数值

c++ - 对于类构造函数,通过括号或等号赋值有什么区别?

c++ - MinGW 找不到 XInput.h header

c++ - 将对象转换为 dlsym 返回的地址

c++ - 为什么使用 std::vector::reserve 有用?

python - 正则表达式使用递增的数字序列 Python

string - 在错误消息中包含数据的惯用方法是什么?

C++ 3 个重载中没有一个可以转换所有参数类型第 39 行 1