有和没有const的相同声明,为什么?

时间:2013-07-06 12:36:37

标签: c++ c++11

如果我有

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

我如何使用一个而不是另一个?为什么要定义这些?

2 个答案:

答案 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).

希望有所帮助。