在您的代码示例中,您使用的是赋值,这要求您返回一个引用。
list[0] = 1;
list.operator[](0) = 1;
int& xref = list.operator[](0);
(xref) = 1; // <-- changed the value of list element 0.
鉴于您希望 operator[](int index) 返回一个值,这将转换为:
int x = list.operator[](0);
x = 1; <-- you changed x, not list[0].
如果您希望 operator[](int index) 返回一个值但 list[0] = 1 仍然有效,您将需要提供两个版本的运算符,以便编译器可以确定您正在尝试哪种行为在给定的调用中调用:
// const member, returns a value.
int operator[] (const int index) const {return list[index];}
// non const member, which returns a reference to allow n[i] = x;
int& operator[] (const int index) {return list[index];}
请注意,它们必须在返回类型和成员常量上有所不同。
#include <iostream>
using namespace std;
class IntList
{
private:
int list[1];
public:
IntList() {list[0] = 0;}
int operator[] (const int index) const { return list[index]; }
int& operator[] (const int index) {return list[index];}
};
int main(int argc, const char** argv)
{
IntList list;
cout << list[0] << endl;
list[0] = 1;
int x = list[0];
cout << list[0] << ", " << x << endl;
return 0;
}
工作演示:http: //ideone.com/9UEJND