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