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

Ada*_*dam 9 c++ iterator

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

我的operator*返回一对(vector)元素的引用.因此,运算符*按值返回.

根据cppreference:

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

那我该怎么回事?

我无法返回原始指针; 这对必须以某种方式返回.所以可能有一些包含operator->的包装器?它是否存在于标准库中,或者通常如何进行?

Yak*_*ont 8

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

返回一个fake_ptr_with_value<decltype(**this)>.

std.

请注意,由于各种迭代器类要求的规范存在缺陷,这仅适用于InputIterators。根据标准,前向迭代器(以及所有更强大的迭代器,如随机访问迭代器)要求operator*返回对真实和稳定对象的引用。

缺陷是标准 (a) 在某些情况下需要引用,而伪引用可以这样做,(b) 混合了“迭代”和“取消引用”语义。

Rangesv3 有一个更加解耦的迭代器类别系统,可以解决这些缺陷中的一些(如果不是全部)。

由于这个问题是关于输入迭代器的,这个解决方案就足够了;我只是包括这个警告,以防有人想在其他地方使用这种技术。您的代码可能会编译并且似乎可以工作,但是当您将迭代器传递给任何std函数时,您几乎肯定会违反 C++ 标准的要求,这意味着您的程序格式错误,无需诊断。


das*_*ght 6

由于->将继续“向下钻取”直到遇到指针返回类型,因此您的代码可以为嵌入该对的该对返回一个“代理”:

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; }
};
Run Code Online (Sandbox Code Playgroud)

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