为什么我们需要两个?在哪种情况下调用以下每个operator []?
class X {
public:
//...
int &operator [](int index);
const int &operator [](int index) const;
};
答案 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 ++