C++11 标准的第 23.2.1.10 条说
“返回的迭代器的复制 ctor 不会引发异常”
这是否基本上说明了迭代器的复制 ctor 可能不会抛出一个 bad_alloc(假设迭代器可能只是一个指针,这里没有问题),因为它将使用“返回的”中已经构建的信息迭代器”?因为它是按值传递的,所以堆栈会在被调用函数中分配,因此可以保证没有内存问题吗?
C++11 标准的第 23.2.1.10 条说
“返回的迭代器的复制 ctor 不会引发异常”
这是否基本上说明了迭代器的复制 ctor 可能不会抛出一个 bad_alloc(假设迭代器可能只是一个指针,这里没有问题),因为它将使用“返回的”中已经构建的信息迭代器”?因为它是按值传递的,所以堆栈会在被调用函数中分配,因此可以保证没有内存问题吗?
法律答案:没有。那只是你的解释。它在技术上是正确的,但它可能不是唯一且唯一的技术上正确的解释。
技术答案:这里的重点是避免变异迭代器抛出的异常(想想插入器或输出迭代器)导致算法被放弃,同时让容器处于未定义和不一致的状态(想想,例如, 到链接尚未完全重新链接的链接列表)
对于具有动态分配状态的迭代器而言,这不仅是 bad_alloc 的问题,而且是在它自己的副本期间尝试修改失败的引用项目的迭代器(例如,因为项目分配抛出)。
当这种情况发生时,迭代器不需要“完成算法”(这是不可能的),而是让容器处于一致且仍然可管理的状态。
该段讨论了标准库中容器使用的迭代器。众所周知,这些迭代器可以通过多种方式实现,因此它们在被复制时不会引发异常。例如,它们都不必使用任何动态分配的内存。
保证仅适用于这些迭代器,而不适用于一般的迭代器(即使遵循示例是个好主意)。
我认为对复制构造函数的含义存在误解。
复制构造函数不负责分配将构建对象本身的内存,这是由调用者在外部提供的。
因此,要求是复制构造函数的主体(无论是编写的还是生成的)不抛出异常。在 C++ 中已知内置类型 ( int
, T*
, ...) 可以在不抛出的情况下复制,并且可以从那里构建可复制的类型而不会抛出异常(只要避免动态资源分配和/或 IO它是自动的)。