[英]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.