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 中标准布局类的定义 的相关文章

  • 向进度条添加百分比文本 C#

    我有一个方法可以显示进程栏何时正在执行以及何时成功完成 我工作得很好 但我想添加一个百分比 如果完成 则显示 100 如果卡在某个地方 则显示更少 我在网上做了一些研究 但我无法适应我正在寻找的解决方案 这是我的代码 private voi
  • 为什么 int8_t 和用户通过 cin 输入显示奇怪的结果[重复]

    这个问题在这里已经有答案了 一小段代码让我发疯 但希望你能阻止我跳出窗外 看这里 include
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

    我想从 Fortran 调用 C 函数 为此 我在 Visual Studio 2010 中创建了一个 FORTRAN 项目 之后 我将一个 Cpp 项目添加到该 FORTRAN 项目中 当我要构建程序时出现以下错误 Error 1 unr
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • 为什么 std::strstream 被弃用?

    我最近发现std strstream已被弃用 取而代之的是std stringstream 我已经有一段时间没有使用它了 但它做了我当时需要做的事情 所以很惊讶听到它的弃用 我的问题是为什么做出这个决定 有什么好处std stringstr
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看

随机推荐