如果我有
T& operator[](int i) const;
const T& operator[](int i) const;
我怎样才能使用一个而不是另一个?为什么要定义这些?
我不认为你可以 - 他们是模棱两可的。通常你会想要这个:
T& operator[](int i); // note no trailing const
const T& operator[](int i) const;
当您的对象不匹配时选择第一个重载const
- 它比第二个匹配更好,而当实例是时选择第二个const
- 第一个根本不匹配。
正确的一对是这个(我认为你的帖子有错字,因为你的意思似乎如下):
T& operator[](int i); //without const;
const T& operator[](int i) const;
至于您的问题,我建议您同时定义它们,因为您最终可能会在代码中同时使用它们。这是一个例子。
void f(X const &a, X & b)
{
int i = get_index();
std::cout << a[i] << std::endl; //this invokes const version
std::cout << b[i] << std::endl; //this invokes non-const version
}
在这段代码中,a[i]
调用 const-version operator[]
,因为a
是一个 const 对象,这意味着它不能调用非 const 版本。但是,在 的情况下b[i]
,C++ 规则规定它应该调用非常量版本,因为该对象b
是非常量并且存在非常量重载operator[]
,所以这是首选。在没有非常量重载的情况下,甚至b[i]
会调用 const 版本,这在很多情况下都是不可取的,例如当您想在 index 处写入数据时i
,例如:
b[i] = item; //it must invoke non-const version in order
//to compile and work (properly).
希望有帮助。