何时调用const操作符[],何时调用非常量操作符[]?

问题描述:

我有两个非常读取和写入的不同行为。在读取的情况下,我想复制一个很难提取数据结构的缓冲区。在写入时,我只会写入无缓冲的结构。何时调用const操作符[],何时调用非常量操作符[]?

到目前为止,我一直在使用operator []来进行访问,所以为了多态性,我想继续这样做。

所以我的问题是这样的:当进行访问时,哪个版本被调用?我的想法是,const被称为读取,非const用于写入。在这种情况下,这是一个简单的实现。否则,它可能会更棘手。

来完成你想要什么,你通常需要有operator[]返回一个代理,和过载operator=operator T(其中T是原始型)为代理类型。然后你可以使用operator T来处理读取,而operator =来处理写入。

编辑:代理的基本思想非常简单:您返回代替原始对象的对象实例。目前,这将有真正的微不足道的语义(只读和向一个向量指定的索引写一个字符);在你的情况下,operator=和(特别是)operator T内部的逻辑显然会更复杂,但对基本结构几乎没有影响。

#include <vector> 

class X { 
    std::vector<char> raw_data; 

    class proxy { 
     X &parent; 
     int index; 
    public: 
     proxy(X &x, int i) : parent(x), index(i) {} 

     operator char() const { return parent.raw_data[index]; } 

     proxy &operator=(char d) { 
      parent.raw_data[index] = d; 
      return *this; 
     } 
    }; 
public: 
    X() : raw_data(10) {} 
    proxy operator[](int i) { return proxy(*this, i); } 
}; 

#ifdef TEST 

#include <iostream> 

int main() { 
    X x; 
    for (int i=0; i<10; i++) 
     x[i] = 'A' + i; 

    for (int i=0; i<10; i++) 
     std::cout << x[i] << "\n"; 
    return 0; 
} 
#endif 

重载分辨率基于this参数,即 - 关于您称为operator[]的对象的常量或缺少常量。

这取决于你在 “分配” 到什么:

const type& x=X[i] 

会调用该函数的const版本

type& x=X[i] 

X[i]=x 

将调用非const版本。最后,一个简单的任务

type x=X[i] 

有没有真正的方式来说,一个是“读”,另一个是“写”。基本上,const版本会将视图返回到您的数据中,而不会反映更新。非常量版本会将视图返回到您的数据中,在此处可以反映更新,但写入后没有提供刷新的语义。

由于读取和写入操作的行为是如此不同,你可能要至少考虑不超载operator[]而是使独立readwrite方法。

要回答你的问题,它基于你操作的对象的一致性。它不知道你将如何处理操作符的结果,因此它只有一件事情要处理,即调用操作符的对象。如果对象是非const的,它将始终调用操作符的非常量(写入)版本。你可以通过将const加到对象上,但是单独的方法似乎是一种更好的方法。