C++11 具有重要成员的匿名联合

2023-12-21

我正在更新我的一个结构,我想向其中添加一个 std::string 成员。原始结构如下所示:

struct Value {
  uint64_t lastUpdated;

  union {
    uint64_t ui;
    int64_t i;
    float f;
    bool b;
  };
};

当然,仅向联合体添加一个 std::string 成员就会导致编译错误,因为通常需要添加对象的重要构造函数。

由于 std::string 定义了所有六个特殊成员函数,因此 U 将具有隐式删除的默认构造函数、复制构造函数、复制赋值运算符、移动构造函数、移动赋值运算符和析构函数。实际上,这意味着除非显式定义一些或全部特殊成员函数,否则您无法创建 U 的实例。

然后网站继续给出了以下示例代码:

union U
{
int a;
int b;
string s;
U();
~U();
};

但是,我在结构中使用匿名联合。我在 freenode 上询问了 ##C++,他们告诉我正确的方法是将构造函数放入结构中,并给了我以下示例代码:

#include <new>

struct Point  {
    Point() {}
    Point(int x, int y): x_(x), y_(y) {}
    int x_, y_;
};

struct Foo
{
  Foo() { new(&p) Point(); }
  union {
    int z;
    double w;
    Point p;
  };
};

int main(void)
{
}

但从那里我无法弄清楚如何定义 std::string 需要定义的其余特殊函数,而且,我并不完全清楚该示例中的 ctor 是如何工作的。

我可以找人向我解释一下吗?


这里不需要放置新的。

变体成员不会由编译器生成的构造函数初始化,但选择一个成员并使用正常的初始化应该没有问题构造函数初始化列表。在匿名联合内部声明的成员实际上是包含类的成员,并且可以在包含类的构造函数中初始化。

此行为在第 9.5 节中进行了描述。[class.union]:

A 类似联盟的class 是联合体或具有匿名联合体作为直接成员的类。一个像工会一样的班级X有一组变体成员. If X是一个联合体,其变体成员是非静态数据成员;否则,其变体成员是属于以下成员的所有匿名联合的非静态数据成员X.

以及第 12.6.2 节中[class.base.init]:

A 构造函数初始化器可以初始化构造函数类的变体成员。如果一个构造函数初始化器指定多个内存初始化器对于同一成员或同一基类,构造函数初始化器格式不正确。

所以代码可以很简单:

#include <new>

struct Point  {
    Point() {}
    Point(int x, int y): x_(x), y_(y) {}
    int x_, y_;
};

struct Foo
{
  Foo() : p() {} // usual everyday initialization in the ctor-initializer
  union {
    int z;
    double w;
    Point p;
  };
};

int main(void)
{
}

当然,当激活一个变体成员而不是在构造函数中初始化的其他成员时,仍然应该使用放置 new 。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++11 具有重要成员的匿名联合 的相关文章

随机推荐

  • setuid 与 seteuid 函数

    setuid 和 seteuid 函数有什么区别 在手册页中 这两个函数都有相似的描述 setuid DESCRIPTION setuid sets the effective user ID of the calling process
  • 如何在运行时更改 WinForms 应用程序的区域性

    我用 C 创建了 Windows 窗体程序 我在本地化方面遇到一些问题 我有两种语言的资源文件 一种是英语 另一种是法语 我想单击每个语言按钮并在运行时更改语言 但是当我点击按钮时 它不起作用 我正在使用这个代码 private void
  • 如何为 Azure AD B2C 设置用户旅程查看器

    根据Azure Active Directory B2C 收集日志 https learn microsoft com en us azure active directory b2c active directory b2c troubl
  • 您认为 Java 中最好的 CMS 是什么 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Rails 3:如何在 application.rb 中声明 Rack 中间件

    很多例子 比如这两个 如何在 Rails3 中使用机架中间件 https stackoverflow com questions 4224900 how to use rack middleware with rails3 http asc
  • VueJS 将 HTML 打印到页面

    我有一个属性 其中包含 HTML 字符串作为其属性之一 当我尝试将其打印到模板中的页面时 它实际上打印了 HTML 因此文本包含 HTML 标签 并且它本身不会被浏览器解释为 HTML 我怎样才能解决这个问题 模板 div class de
  • 无法在 Android 8 中禁用通知振动

    我试着禁用振动显示通知时 Func public static Notification buildNotifForUploaderService Context ctx String title String message Notifi
  • Pandas 数据框按日期移动列

    我有一个按日期和 ID 索引的面板数据集 看起来像这样 df pd DataFrame Date 2005 12 31 2006 03 31 2006 09 30 2005 12 31 2006 03 31 2006 06 30 2006
  • 绕过错误并继续代码

    这是我之前遇到的一个简单问题 本质上 像这样的解决方案 https stackoverflow com questions 574730 python how to ignore an exception and proceed and t
  • 在 Android 上替换 ViewPager 中的当前 Fragment

    我有一个ViewPager我必须更换第一个Fragment如果某个动作发生 public static class PagerAdapter extends FragmentStatePagerAdapter private TempCha
  • 如何添加可拖动的“文本字段”以在颤振中的图像上添加文本?

    我正在 flutter 中创建一个 Meme 生成器应用程序 我只需要知道是否有一种方法 用户本身可以在图像上添加文本并将该文本拖动到图像区域中的任何位置 这样图片看起来很有趣 我尝试过拖动框小部件 但不知道如何将其用于文本字段 这样我也可
  • SQL 2008+ NOLOCK 与 READPAST 对于报告准确性的注意事项

    了解最终的决策是业务决策 在 SQL 2008 R2 中运行的 NOLOCK 和 READPAST 之间的准确性考虑因素是什么 在与业务领域讨论变更之前 我希望能有更好的理解 我继承了许多查询 用于创建管理报告的数据视图 WITH NOLO
  • iPhone:获取 Google 地图的选定缩放级别

    当用户使用以下任一方式时 我们需要获取 MKMapView 当前选择的缩放级别 使用 Mapkit 放大或缩小 Google 地图 我们尝试过的解决方案在模拟器上运行良好 但在真实环境中运行不佳 设备 具有 iOS 3 0 1 的 iPho
  • 将 NLTK Rake 应用于 Dataframe 中的每一行

    我想应用 Rake 函数 https pypi org project rake nltk https pypi org project rake nltk 到我的数据框中的每一行 我可以将该函数单独应用于特定行 但不能将其附加到数据帧 这
  • Solr 索引中缺少 Id 字段

    我刚刚发现我的 Solr 索引不包含 id场地 并且无法获取项目 id UniqueId 存在 但这并不是真正有用 public class MyClass IndexField BuiltinFields UniqueId public
  • 在二叉搜索树中查找最小和的算法改进

    我编写了以下函数来找出二叉搜索树中任何路径的最小总和 int minSumPath TreeNode root if root NULL return 0 int sum root gt value if root gt left NULL
  • 存储 API URL 并在 Angular 中使用的最佳方式是什么

    我想将所有 API URL 存储在一个位置 即在 JSON 文件中 我想在我的应用程序中使用该 JSON 文件 i 保存 JSON 文件的最佳位置是哪里 ii 如何使用 Type 脚本文件中的 URL 我会将基本网址存储在environme
  • Elasticsearch 重新索引现有类型映射中的项目

    我向类型映射添加了一个新属性 我需要重新索引该类型的所有现有项目才能使用新属性 我应该使用哪个 API 来执行此操作 如果您要添加索引中以前从未存在过的新字段 则无需重新索引 只需使用 PUT 映射 API 添加新字段http nocf w
  • 配置 ActiveStorage 以使用具有 IAM 角色的 S3

    我正在尝试配置 ActiveStorage 以使用 S3 存储桶作为存储后端 但我不想传递任何access key id secret access key region 相反 我想使用之前定义的 IAM 角色 提到了这样的配置here h
  • C++11 具有重要成员的匿名联合

    我正在更新我的一个结构 我想向其中添加一个 std string 成员 原始结构如下所示 struct Value uint64 t lastUpdated union uint64 t ui int64 t i float f bool