实现C ++后缀增量运算符
我编译了以下示例:
#include <iostream>
#include <iterator>
using namespace std;
class myiterator : public iterator<input_iterator_tag, int>
{
int* p;
public:
myiterator(int* x) :p(x) {}
myiterator(const myiterator& mit) : p(mit.p) {}
myiterator& operator++() {++p;return *this;}
myiterator& operator++(int) {myiterator tmp(*this); operator++(); return tmp;}
bool operator==(const myiterator& rhs) {return p==rhs.p;}
bool operator!=(const myiterator& rhs) {return p!=rhs.p;}
int& operator*() {return *p;}
};
int main () {
int numbers[]={10,20,30,40,50};
myiterator beginning(numbers);
myiterator end(numbers+5);
for (myiterator it=beginning; it!=end; it++)
cout << *it << " ";
cout << endl;
return 0;
}
来自cplusplus.com/reference,我收到编译器警告:
iterator.cpp: In member function 'myiterator& myiterator::operator++(int)':
iterator.cpp:13: warning: reference to local variable 'tmp' returned
这有什么不对?后缀签名应该是myiterator operator++(int)
,即按值返回?
是否在某处定义了后缀签名在STL迭代器上应该是什么样子?
没有找到相关结果
已邀请:
4 个回复
嗓瑰
的东西”,其中
是迭代器。在实践中,这意味着如果适用于您(它没有)或按值返回,您可以通过引用返回。 见24.1.3 / 1
委婪绷冗诉
才脊烽馈低
应该:
作为旁注: 您实际上不需要复制构造函数:
编译器生成的版本将完美地工作(因为您不拥有类所包含的RAW指针,因此三/四的规则不适用)。 您的比较运算符可能应该标记为const,我个人更喜欢根据==运算符定义!=运算符,让编译器优化掉任何不相关性(尽管这只是个人的事情)。
操作员*应该有两个版本。普通版和常量版。
作为最后一点:指针本身就是一个迭代器。所以你实际上不需要包装指针来使它们成为迭代器,它们将作为迭代器正确运行(而不仅仅是输入迭代器而是随机访问迭代器)。
桑娠贯涤