实现如何保证迭代器的复制构造函数不会抛出

How can an implementation guarantee that copy constructor of an iterator is no throw?

本文关键字:构造函数 复制 何保证 迭代器 实现      更新时间:2023-10-16

C++11 标准的第 23.2.1.10 条说

"没有返回的迭代器的副本 ctor 引发异常"

这是否基本上表明迭代器的副本 ctor 是否有可能不抛出一个bad_alloc(离开迭代器可能只是一个指针而这里没有问题的情况),因为它将使用已经在"返回的迭代器"中构建的信息? 因为它是按值传递的,所以堆栈是否会在被调用的函数中分配,因此可以保证没有内存问题?

该段落讨论了标准库中容器使用的迭代器。众所周知,这些迭代器是可实现的,因此它们在复制时不会引发异常。例如,它们都不必使用任何动态分配的内存。

保证仅适用于这些迭代器,不适用于一般的迭代器(即使遵循示例是个好主意)。

法律答案:否。塔特只是你的解释。它在技术上是正确的,但它可能不是技术上唯一正确的解释。

技术答案:这里的重点是避免由变异迭代器(想想插入器或输出迭代器)抛出的异常导致算法被放弃,同时让容器处于未定义和不一致的状态(例如,想想链接尚未完全重新链接的链表)

对于具有动态分配状态的迭代器来说,这不仅是一个bad_alloc的问题,而且对于迭代器来说 - 在它自己的复制期间 - 尝试修改引用的项目失败(例如,因为项目分配抛出)。

当这种情况发生时,迭代器不需要"完成算法"(这是不可能的),而是让容器处于一致且仍可管理的状态。

我认为对

复制构造函数的含义存在误解。

复制构造函数不负责分配将在其中构建对象本身的内存,这是由调用者在外部提供的。

因此,要求是复制构造函数的主体(无论是编写的还是生成的)不会抛出。在C++中已知内置类型(intT*,...)可以在不抛出的情况下复制,并且从那里可以构建因此可复制而不会抛出异常的类型(只要避免动态资源分配和/或IO,它就是自动的)。