繁体   English   中英

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

[英]arrow operator (operator->) return type when dereference (operator*) returns by value

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

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

根据cppreference:

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

那我该怎么回事?

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

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

返回fake_ptr_with_value<decltype(**this)>

没有这样的帮助类型从std暴露。

请注意,由于各种迭代器类所需的规范中的缺陷,这仅适用于InputIterator 在标准下,转发迭代器(以及所有更强大的迭代器,如随机访问迭代器)要求operator*返回对真实且稳定的对象的引用。

缺点是标准(a)在某些情况下需要在伪引用时进行引用,(b)混合“迭代”和“解引用”语义。

Rangesv3有一个更加分离的迭代器类别系统,它解决了一些(如果不是全部)这些缺陷。

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

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

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 ->()实现返回指向它的指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM