取消引用(operator *)按值返回时,箭头运算符(operator->)返回类型

时间:2018-10-17 13:31:32

标签: c++ iterator

我正在编写一个InputIterator,它实现了operator *和operator->等。

我的运算符*返回一对(向量)元素的引用。因此,运算符*将按值返回。

根据cppreference:

  

运算符->的重载必须返回原始指针,或者返回对象(按引用或按值),而运算符->的对象又被重载。

那我该怎么办?

我不能返回原始指针;该对必须以某种方式物理返回。 那么可能有一些带有operator->定义的包装器?它是否存在于标准库中,或者通常如何进行?

2 个答案:

答案 0 :(得分:4)

-> will continue "drilling down" until it hits a pointer return type起,您的代码可以为其中嵌入了该对的那个对返回“代理”:

template<class T1, class T2>
class pair_proxy {
    std::pair<T1,T2> p;
public:
    pair_proxy(const std::pair<T1,T2>& p) : p(p) {}
    std::pair<T1,T2>* operator->() { return &p; }
};

注意:我会强烈考虑在您的迭代器中嵌入std::pair,并从您的operator ->()实现中返回指向它的指针。

答案 1 :(得分:3)

template<class T>
struct fake_ptr_with_value {
  T t;
  T* operator->() { return std::addressof(t); }
};

返回fake_ptr_with_value<decltype(**this)>

std中没有暴露这样的帮助程序类型。