索引运算符constness

时间:2009-10-20 13:28:04

标签: c++

为什么我们需要两个?在哪种情况下调用以下每个operator []?

  class X {
      public:
        //...
        int &operator [](int index);
        const int &operator [](int index) const;
    };

5 个答案:

答案 0 :(得分:5)

foo( X x )
{
  x[0];  // non-const indexer is called
}

bar ( const X x )
{
  x[0]; //const indexer is called
}

答案 1 :(得分:1)

如果类X实例是const,则调用const版本,否则调用非const:

void function1( X& x )
{
    x[0]; // x is non-const, non-const version is called
    x[0] = ... // allright
}

void function2( const X& x )
{
    x[0]; // x is const, const version is called
    x[0] = ... // illegal - won't compile
}

这样做是为了促进正确性。

答案 2 :(得分:0)

如果在const X对象上调用operator [],则使用const one;否则是非常数。

X x;
x[42] = 42; // ok

X x_const;
x_const[42] = 42; // error: cannot assign to const reference

答案 3 :(得分:0)

当类的实例被称为非const类型时,将调用第一个。当引用该实例的类型为const时,将调用第二个。

例如:

void check_array(X const& x)
{
   // x[0] = 2;  // That would be a compile error.  
                 // And it's GOOD that we have such a check!
   return x[1] == 5; //calls non-const version
}

void mutate_array(X& x)
{
   x[0] = 2; // calls non-const version
   if (x[1] == 5){  //calls non-const version anyway!
       X const& const_ref = x;
       return const_ref[1] == 5;  //NOW it calls const version.
   }
}

使用它的原因是:

  • 强制检查我们不尝试修改某些内容,不应修改(如check_array()函数中所述)
  • 允许编译器优化代码,知道某些值不会在块中发生变化。

答案 4 :(得分:-1)

使用2个版本为编译器提供了其他优化方法。没有值不能分配给const int&。每当语句允许时调用第二个运算符,并且由于运算符是const,编译器具有额外的优化可能性。只要将结果赋给该运算符的返回值,编译器就会选择第一个版本(不是const)。

有关更完整的解释,请参阅Scott Meyers(更多)Effective C ++