实现C++ postfix增量运算符

chr*_*ris 5 c++ operator-overloading post-increment postfix-operator

我编译了以下示例:

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

来自cplusplus.com/reference,我收到编译器警告:

iterator.cpp: In member function 'myiterator& myiterator::operator++(int)':
iterator.cpp:13: warning: reference to local variable 'tmp' returned
Run Code Online (Sandbox Code Playgroud)

这有什么不对?后缀签名是否应该是myiterator operator++(int)按值返回?

是否在某处定义了后缀签名在STL迭代器上应该是什么样子?

Joh*_*ing 5

是否在某处定义了后缀签名在STL迭代器上应该是什么样子?

标准.

标准规定了这样的事情.在这个操作的情况下,标准基本上说"你必须返回可转换为的东西const X&",其中X是迭代器.在实践中,这意味着如果适用于您(它没有)或按值返回,您可以通过引用返回.

见24.1.3/1