C++14 中标准布局类的定义

2024-01-08

A 标准布局class 在 C++14 中的 [class]/7 中定义,如下(重点是我的):

A 标准布局class 是一个类:

  • (7.1) — 没有非标准布局类型的非静态数据成员 类(或此类类型的数组)或引用,
  • (7.2) — 没有虚函数 (10.3) 也没有虚基类 (10.1),
  • (7.3) — 对所有非静态具有相同的访问控制(第 11 条) 数据成员,
  • (7.4) — 没有非标准布局基类,
  • (7.5) — 要么在最派生的中没有非静态数据成员 班级and至多一个具有非静态数据成员的基类,或者具有 没有带有非静态数据成员的基类,并且
  • (7.6) — 没有与第一个非静态类型相同的基类 数据成员。

我关心的是与项目符号(7.5)有关:如何可能no最底层派生类中是否有非静态数据成员,同时具有一个包含非静态数据成员的基类?

换句话说,基类的非静态数据成员不也是最派生类的非静态数据成员吗?


是的,这是 C++14 中的一个缺陷,具体来说CWG 1813 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1813。虽然可以通过读取“非静态数据成员”来修复仅引用direct(非继承的)非静态数据成员(在其他地方可能是必需的),所选择的修复是用以下内容替换您发现有问题的语言:

标准布局类是这样的类:[...]

  • 具有类及其基类中的所有非静态数据成员和位字段,首先在同一个类中声明,[...]

要做到这一点有点棘手;对于将继承的成员视为派生类的成员的想法存在一些阻力,尽管[类.派生] has:

[...] 除非在派生类中重新声明,否则基类的成员 也被视为派生类的成员。除构造函数之外的基类成员被认为是遗传由派生类。 [...]

尽管如此,在许多地方,直接和继承的非静态数据成员都被认为是专门调用继承的数据成员的,例如也在[class](决议后CWG 1672 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1672):

8.6 - 在其元素或非静态数据成员中包括上述类型之一的聚合或联合类型(递归地包括子聚合或包含的联合的元素或非静态数据成员),

Or in [基本.lval]:

7.8 - 如果 X 是非联合类类型,则如果 X 没有(可能是继承的(第 10 条)),则集合 M(X) 为空 非静态数据成员; [...]

同时,在许多地方,“成员”必须被理解为仅指直接成员才有意义;首先仅查看非静态数据成员(不是成员函数),[expr.rel]/3.2、[expr.const]/5.1、[dcl.constexpr]/4.6、[class.mem]/17、 /19,[特殊]/5,[class.ctor]/4.3,/4.4,/4.10,/4.12,[class.dtor]/5.6,[class.base.init]/2,/13.3,[类。 copy]/12.2、/12.4、/18.2、/25.2、/25.4、/26.3、/27、[ except.spec]/15.1.1.1、/15.2、/15.3 都是“非静态数据成员”可以使用的地方或者应该有“direct”前缀。

另一方面,在某些地方(例如在修改后的[class]中,或在[class.copy]/23.2-23.3,/28中)“成员”被隐式地视为包括继承的成员,所以有点混乱。

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

C++14 中标准布局类的定义 的相关文章

  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐