-3

如果我有

T& operator[](int i) const;
const T& operator[](int i) const;

我怎样才能使用一个而不是另一个?为什么要定义这些?

4

2 回答 2

3

我不认为你可以 - 他们是模棱两可的。通常你会想要这个:

T& operator[](int i); // note no trailing const
const T& operator[](int i) const;

当您的对象不匹配时选择第一个重载const- 它比第二个匹配更好,而当实例是时选择第二个const- 第一个根本不匹配。

于 2013-07-06T12:40:53.873 回答
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]调用 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).

希望有帮助。

于 2013-07-06T12:43:17.680 回答