标准库容器和不完整类型的规则是什么?

2023-11-25

给定一个不完整的类型:

struct S; 

那么以下声明是:

S *p;            // ok, pointer to incomplete types is allowed

std::deque<S> l;  // error, instantiating std::deque with incomplete type is UB

但是下面的声明呢?

std::deque<S> *p;   // seems to be UB like the previous case, 
                   // but is it ok if p is not used till S is defined?

std::deque<S*> p;   // not really sure about this one

编辑:使用的问题std::list代替std::deque,但这违背了问题的目的,因为std::list明确地allowed使用不完整的类型。std::deque似乎没有这样的允许.


std::deque<S> *p;   // seems to be UB like the previous case, 
                   // but is it ok if p is not used till S is defined?

这实际上是这里有趣的一点。是的,实例化类型不完整的容器是不允许的,没有规定。但问题是它是否真的被实例化了。根据核心语言,它不一定是这样。

[温度设置]

1除非类模板特化已明确 实例化或显式专门化,类模板 当专业化是隐式实例化时 在需要完全定义的对象类型的上下文中引用 或者当类类型的完整性影响语义时 该程序。

指向类型的指针并不要求类型是完整的。因此,仅此声明通常不足以导致类模板的实例化,因此确定此处违反容器的要求可能为时过早。

当然除非我们采取“类类型的完整性影响程序的语义”将违反合同的行为纳入标准库中。一个实现could我想在这里实例化。然而,我不知道有任何实现,因此这可能不是所需的解释。

因此,为了谨慎起见,我也认为这个 UB 是正确的。


std::deque<S*> p;  // not really sure about this one

这可以。无论是否S做完了,S*仍然是一个完整的对象类型。我这么说是因为它不包含在

[基本类型]

5已声明但未定义的类、枚举 在某些上下文中键入([dcl.enum]),或未知边界的数组或 不完整元素类型,是不完整定义的对象类型。 不完全定义的对象类型和 cv void 是不完全类型 ([基本.根本])。对象不应被定义为具有 不完整类型。

完整性约束S仅当尝试在执行取消引用或指针算术的表达式中使用此类指针时才会出现。但指针类型本身仍然是完整的。因此它是容器类型的有效模板参数。

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

标准库容器和不完整类型的规则是什么? 的相关文章

随机推荐

  • 错误:MEX 文件无效,找不到指定的模块

    我已经在我的笔记本电脑上成功编译了 Mex 文件 但是当我运行它时 它说Invalid mex file c newfolder filename mexw32 The specified module could not be found
  • ruby 中的同一程序如何接受用户输入以及命令行参数

    我的 ruby 脚本从命令行参数获取某些输入 它检查是否缺少任何命令行参数 然后提示用户输入 但我无法使用 gets 从用户那里获取输入 示例代码 test rb name ARGV each do a if a include n nam
  • ASP.NET:如何处理并行请求

    让我们想象一下网站上有 2 个页面 快速页面和慢速页面 对慢速页面的请求执行 1 分钟 对快速页面的请求执行 5 秒 在我的整个开发生涯中 我认为如果第一个启动的请求很慢 他将对数据库进行 同步 调用 等待答案 如果在此期间完成对快速页面的
  • Flutter:应该只有一项具有 [DropdownButton] 的值

    我正在尝试创建一个下拉按钮在颤振中 我得到了列表来自我的数据库然后我将列表传递给我的dropdownButton 一切正常数据按预期显示 但是当我从中选择一个元素时我收到此错误 There should be exactly one ite
  • SpecFlow 与数据库模式的集成测试

    我正在尝试设置 SpecFlow 进行集成 验收测试 我们的产品在 Sqlite 中有一个支持数据库 虽然不是很大 但这实际上被证明是一个有点棘手的问题 如何为测试建立数据库模型 我想知道其他人使用什么模式来对支持数据库进行集成 验收测试
  • 用于单独 HTML 页面的 GWT 多模块?

    我对 GWT 很陌生 打算使用 GWT 开发用户管理应用程序的 UI 我计划使用使用 Spring Hibernate 创建的现有模块 我想出了如何将 GWT 与 Spring 集成 但我不知道如何设计布局 我想要两页 用户注册页面 想要在
  • 发生验证错误时 Symfony2 表单字段未更新

    这是我的表单类型 class TestFormType extends AbstractType public function buildForm FormBuilderInterface builder array options bu
  • 插入排序比冒泡排序更好?

    我正在为考试做复习 想知道在相同的平均情况复杂度为 O N 2 的情况下 插入排序比冒泡排序表现更好 我确实找到了一些相关文章 但我无法理解它们 有人介意用简单的方式解释一下吗 冒泡排序的优点在于检测已排序列表的速度 冒泡排序最佳案例场景
  • shapefile 和 matplotlib:绘制 shapefile 坐标的多边形集合

    我正在尝试使用 python 中的 matplotlib 在世界地图上绘制国家 地区的填充多边形 I ve got a shapefile with country boundary coordinates of every country
  • ListView 和带有倒计时器的项目

    我的 Listview 有问题 我想为所有 ListView 的项目设置一个倒计时器 并且我已经在 google 上搜索了解决方案 但它无法正常工作 问题是 ListView 重用 回收 视图 并且我总是得到错误的项目时间 我在视图中使用了
  • 使用 JAXB 2.1 将多个模式编译到不同的包中

    我有一个 CommonTypes xsd 我使用 xs include 将其包含在我的所有其他 XSD 中 我明白了 Multiple
  • 蓝鸟中的嵌套承诺

    我试图弄清楚如何在蓝鸟库中正确使用承诺 我在代码中遇到了一些嵌套的承诺 我注意到在 bluebird 文档中它写道 如果您使用完整的 bluebird API 产品 您几乎永远不需要首先求助于嵌套承诺 还有许多其他关于承诺被滥用的博客文章嵌
  • 用于 SMS 的 ContentObserver [重复]

    这个问题在这里已经有答案了 我正在尝试提取发送的短信 我知道没有用于此目的的 BroadcastReciver 所以我发现我可以使用 ContentObserver 来监听数据库中的更改 我怎样才能实现这个 我的目标是仅获取发送的新短信并通
  • 两个相同的字符串不相等(不是指针/引用错误)

    我从文件中读取了一行 KatalogObrazk w 1 32 意味着我应该在以下位置查找数据 C Users NAME OF THE USER KatalogObrazk w 所以我就这么做了 但可怕的事情正在发生 在splitLine
  • WPF:即使显式设置 WindowState,窗口仍保持最小化

    我的应用程序有一个托盘图标 双击该图标可隐藏或显示应用程序窗口 我的问题是 如果窗口隐藏时处于最小化状态 我似乎无法将窗口带到前台 例如 假设用户最小化应用程序 然后双击托盘图标 然后应用程序窗口将隐藏并从任务栏中消失 当用户再次双击托盘图
  • GenyMotion 虚拟设备打开并立即消失

    我下载了带有虚拟 VM 包的 GenyMotion Android 模拟器 一切都很顺利 直到虚拟设备下载过程为止 虚拟设备已成功下载 但当我尝试通过点击播放按钮运行虚拟设备时 会弹出一个小窗口 显示正在初始化虚拟设备 然后启动虚拟设备 几
  • 如何仅在触发特定活动后启动 FCM ID 服务?

    假设我有一个LoginActivity用户可以在其中使用现有凭据注册或登录 我不想要FirebaseInstanceIdService生成令牌 除非用户已登录并且MainActivity应用程序的启动 谢谢 你无法阻止FirebaseIns
  • Mockito 间谍 - 调用内部类方法而不是监视间谍对象中的方法时

    我的内部类如下 public class ClassWithInnerObject private final InnerObject innerObject public ClassWithInnerObject innerObject
  • 获取shell中程序的执行时间

    我想在几个不同的条件下在linux shell 中执行某些操作 并且能够输出每次执行的执行时间 我知道我可以编写一个 perl 或 python 脚本来执行此操作 但是有没有办法在 shell 中执行此操作 恰好是 bash 使用内置的ti
  • 标准库容器和不完整类型的规则是什么?

    给定一个不完整的类型 struct S 那么以下声明是 S p ok pointer to incomplete types is allowed std deque