结构解除引用运算符(operator-) [英] Structure dereference operator (operator->)

查看:71
本文介绍了结构解除引用运算符(operator-)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为迭代器编写一个薄模板包装器,并在通过结构取消引用运算符时遇到了绊脚石,主要是因为指针没有一个:

I am writing a thin template wrapper for iterators, and hit a stumbling block when passing through the structure dereference operator, mainly because pointers don't have one:

#include <vector>

struct mystruct {
    int member;
};

template<class iterator>
struct wrap {
   typedef typename std::iterator_traits<iterator>::pointer pointer;
   iterator internal;
   pointer operator->() {return internal.operator->();} //MARK1
};

int main() {
    wrap<std::vector<mystruct>::iterator> a;
    a->member;
    wrap<mystruct*> b;
    b->member;
    return 0;
}

http://ideone.com/XdvEz

prog.cpp: In member function ‘typename std::iterator_traits<_Iter>::pointer wrap<iterator>::operator->() [with iterator = mystruct*]’:
prog.cpp:18:   instantiated from here
prog.cpp:11: error: request for member ‘operator->’ in ‘((wrap<mystruct*>*)this)->wrap<mystruct*>::internal’, which is of non-class type ‘mystruct*’

此以下方法有效,但我认为不能保证该方法有效.即,如果迭代器具有奇怪的 pointer 类型,而该类型与指向 value_type 的指针不同.

This following method works, but I don't think it's guaranteed to work. Namely, if an iterator has a strange pointer type that isn't the same as a pointer to a value_type.

   pointer operator->() {return &*internal;} //MARK3

推荐答案

标准间接指出,重载的 operator-> 必须返回一个指针,该对象可以转换为指针,或 operator-> 重载的对象.最好的选择是返回 internal .

The standard indirectly says that an overloaded operator-> has to either return a pointer, an object that is convertible to a pointer, or an object that has overloaded operator->. Your best bet is to just return internal.

第13.5.6节[over.ref] p1

表达式 x-> m 解释为(x.operator->())-> m

(以上内容适用于递归.)

(The above applies recursively.)

这篇关于结构解除引用运算符(operator-)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆