强制编译器选择const运算符重载

时间:2014-03-02 20:31:53

标签: c++

我正在尝试模拟缓存。给定数组时,我必须确定operator[](size_t i)是用于获取数据还是设置数据。我在其签名中使用const重载了它,而没有它用于设置部分。

我的问题是,由于数组是动态分配的,因此只调用非const operator[]。例如:

    class A {    
            int n;
            double *v;
    public:
            A(int i) : n(i),v(new double[i]) {}   
            const double & operator[](int i) const {
                cout<<"get"<<endl ;
                return v[i];
            }   
            double& operator[](int i) {
                cout<<"set"<<endl;
                return v[i];
            }   
    };
    int main(){
        double pi = 3.14;
        A a(10);
        a[2] = pi;   
        pi = a[3];
    }

结果是

 set
 set

但我希望打印

set
get

2 个答案:

答案 0 :(得分:3)

它与动态分配的数组没有任何关系。您的变量a不是const,因此将在其上调用非const函数。如果您有const B b(10);并且b[3],则会调用const版本。

如果您真的想要,可以通过强制转换为const引用来强制调用const版本:

static_cast<const A&>(a)[3]

(或者,创建一个引用变量并在其上调用它)

答案 1 :(得分:2)

您已经发现为什么operator[]是一个糟糕的界面&#39;对于类似缓存的操作,以及为什么每个人似乎都被std::map的行为所困扰,如果你试图索引&#39;一个不存在的。

我会编写明确的getset方法,这样您就不会对缓存类的用户感到惊讶。