左值和右值的 C++ 运算符重载 [ ]

C++ Operator Overloading [ ] for lvalue and rvalue

我制作了一个 class 数组,其中包含一个整数数组。从 main 函数中,我尝试使用 [ ] 获取 Array 中的数组元素,就像我们对 main 中声明的数组所做的那样。我重载了运算符 [ ],如下面的代码所示;第一个函数 returns 是左值,第二个函数是右值(未显示构造函数和其他成员函数。)

#include <iostream>
using namespace std;

class Array {
public:
   int& operator[] (const int index)
   {
      return a[index];
   }
   int operator[] (const int index) const
   {
      return a[index];
   }

private:
   int* a;
}

但是,当我尝试从 main 调用这两个函数时,即使变量未用作左值,也只有第一个函数被访问。如果一切都可以通过使用左值函数来处理,我看不出为右值创建一个单独的函数的意义。

以下代码是我使用的主要函数(运算符<<被适当重载。):

#include "array.h"
#include <iostream>
using namespace std;

int main() {
   Array array;
   array[3] = 5;                // lvalue function called
   cout << array[3] << endl;    // lvalue function called
   array[4] = array[3]          // lvalue function called for both
}

有什么方法可以调用右值函数吗?是不是也需要为左值和右值都定义函数?

第二个函数是 const member function,如果您有 const 实例,它将被调用:

const Array array;
cout << array[3] << endl;  // rvalue function called

调用这些 "lvalue" 和 "rvalue" 函数是不习惯的。如果需要,您可以将常量定义为 return 常量引用。