如果我有
T& operator[](int i) const;
const T& operator[](int i) const;
我如何使用一个而不是另一个?为什么要定义这些?
答案 0 :(得分:3)
我认为你不能 - 他们是模棱两可的。通常你想要这个:
T& operator[](int i); // note no trailing const
const T& operator[](int i) const;
当您的对象不是const
时,会选择第一个重载 - 它比第二个更好匹配,而第二个是在实例为const
时选择的 - 第一个不匹配于所有
答案 1 :(得分:1)
正确的一对就是这个(我认为你的帖子有拼写错误,因为你似乎意味着以下内容):
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]
调用operator[]
的const-version,因为a
是一个const对象,这意味着它不能调用非const版本。但是,在b[i]
的情况下,C ++规则规定它应该调用非const版本,因为对象b
是非const的,并且存在operator[]
的非常量重载,所以这是优先的。在没有非const重载的情况下,即使b[i]
也会调用const版本,这在许多情况下都是不可取的,例如当你想在索引i
写入数据时,如:
b[i] = item; //it must invoke non-const version in order
//to compile and work (properly).
希望有所帮助。