C++ 数组运算符[]重载常量和非常量版本

C++ 数组运算符[]重载常量和非常量版本,c++,operator-overloading,constants,C++,Operator Overloading,Constants,我得到了一个任务来实现一个模板数组类。 要求之一是使[]操作员过载。 我制作了两个常量和非常量版本,看起来效果不错 const T& operator[](const unsigned int index)const 及 我的问题是编译器如何知道运行哪一个 我什么时候会这样做: int i=arr[1] 在非常量数组上?这一切都取决于对象的声明。如果你有 const T arr[]; ... int i=arr[1]; T arr[]; ... int i=arr[1]; 然后将

我得到了一个任务来实现一个模板数组类。 要求之一是使[]操作员过载。 我制作了两个常量和非常量版本,看起来效果不错

const T& operator[](const unsigned int index)const

我的问题是编译器如何知道运行哪一个 我什么时候会这样做:

int i=arr[1]

在非常量数组上?

这一切都取决于对象的声明。如果你有

const T arr[];
...
int i=arr[1];
T arr[];
...
int i=arr[1];
然后将调用const版本,但是如果

const T arr[];
...
int i=arr[1];
T arr[];
...
int i=arr[1];

然后将调用非常量版本。因此,在您给出的示例中,由于它是一个非常量数组,因此将调用非常量版本。

非常量函数将始终在非常量数组上调用,常量函数将始终在常量数组上调用

如果有两个同名的方法,编译器将根据参数的类型和隐式对象参数(arr)的类型选择最合适的方法


前几天我刚刚回答了一个类似的问题,你可能会发现它很有用:

它会调用
const
对象上的
const
版本,否则就调用非
const
版本。我不太明白你的意思,你能详细说明一下吗?如果
arr
是const,将调用常量版本。可能的重复您的意思是编译器更喜欢调用非常量版本而不是常量版本吗?如果是,你能解释一下原因吗?@petric是的,会的。至于原因,想象一下,如果每次调用函数时它都默认为const版本,会发生什么。这将是不可能做任何事情的,而且拥有一个非常量版本的函数也没有意义,因为它永远不会被调用。谢谢你,这真的很有帮助。