实现如何保证迭代器的复制构造函数不会抛出
How can an implementation guarantee that copy constructor of an iterator is no throw?
C++11 标准的第 23.2.1.10 条说
"没有返回的迭代器的副本 ctor 引发异常"
这是否基本上表明迭代器的副本 ctor 是否有可能不抛出一个bad_alloc(离开迭代器可能只是一个指针而这里没有问题的情况),因为它将使用已经在"返回的迭代器"中构建的信息? 因为它是按值传递的,所以堆栈是否会在被调用的函数中分配,因此可以保证没有内存问题?
该段落讨论了标准库中容器使用的迭代器。众所周知,这些迭代器是可实现的,因此它们在复制时不会引发异常。例如,它们都不必使用任何动态分配的内存。
保证仅适用于这些迭代器,不适用于一般的迭代器(即使遵循示例是个好主意)。
法律答案:否。塔特只是你的解释。它在技术上是正确的,但它可能不是技术上唯一正确的解释。
技术答案:这里的重点是避免由变异迭代器(想想插入器或输出迭代器)抛出的异常导致算法被放弃,同时让容器处于未定义和不一致的状态(例如,想想链接尚未完全重新链接的链表)
对于具有动态分配状态的迭代器来说,这不仅是一个bad_alloc的问题,而且对于迭代器来说 - 在它自己的复制期间 - 尝试修改引用的项目失败(例如,因为项目分配抛出)。
当这种情况发生时,迭代器不需要"完成算法"(这是不可能的),而是让容器处于一致且仍可管理的状态。
复制构造函数的含义存在误解。
复制构造函数不负责分配将在其中构建对象本身的内存,这是由调用者在外部提供的。
因此,要求是复制构造函数的主体(无论是编写的还是生成的)不会抛出。在C++中已知内置类型(int
,T*
,...)可以在不抛出的情况下复制,并且从那里可以构建因此可复制而不会抛出异常的类型(只要避免动态资源分配和/或IO,它就是自动的)。
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 使用复制构造函数复制双精度数组
- C 无可行的构造函数复制类型的变量
- 没有可行的构造函数复制类型 'MyString' 的数组元素
- 编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
- 如何最小化调用列表构造函数(复制构造函数)的次数?
- C 11矢量构造函数复制与范围
- 我定义了一个非复制构造函数;复制构造函数还会被隐式定义吗
- 可以将构造函数复制为转换运算符
- 将基类指针的构造函数复制到子类
- C++树类:构造函数/复制/内存泄漏
- 如何制作这个在模板构造函数复制中使用类型定义的类型的模板
- 将构造函数复制为模板化的成员函数
- 绕过私有复制构造函数/复制赋值C++
- C++通过构造函数复制对象
- 复制构造函数 - 复制C++中的对象
- 将带unique_ptr的类的构造函数复制到作为成员的抽象类