【发布时间】:2019-03-22 05:01:05
【问题描述】:
我正在编写一个 InputIterator,它实现了 operator* 和 operator->。
我的 operator* 返回一对(向量)元素的引用。因此,Operator* 按值返回。
根据cppreference:
运算符 -> 的重载必须要么返回一个原始指针,要么返回一个对象(按引用或按值),而运算符 -> 又对其进行了重载。
那我要返回什么?
我无法返回原始指针;这对必须以某种方式物理返回。 那么可能一些带有 operator-> 定义的包装器?是否存在于标准库中,或者一般是怎么做的?
【问题讨论】:
-
我想我可以返回一个包装器,它将值作为数据成员保存,并定义一个 operator-> 来返回指向其数据成员的指针。但它是否存在于 std 库中?
-
使用
std::pair左右 -
但是迭代器类或结构应该已经是一个“包装器”,它引用了你的“容器”中的一个元素。迭代器最简单的解决方案是包含当前位置,从中您可以获得被引用的“值”(“对象”)。然后很容易返回一个指向被引用元素的指针。
-
作为一个粗略的规则,如果一个类'
operator*()(取消引用)返回一个值而不是一个引用,那么质疑它是否应该有一个operator->()是合适的。习惯上,object->a和(*object).a通常是对同一实体的引用(或值),如果operator*()按值返回,则实现这一点相当复杂,有时甚至是不可能的。 -
@Someprogrammerdude 这不是我的情况,但是如果您在向量中有更多迭代器,例如并按顺序处理它们,存储值类型的迭代器将占用过多空间,而不是迭代器在取消引用时返回包装器/代理/->。